diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 000000000..dabcc8d3a
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,21 @@
+# EditorConfig is awesome: http://EditorConfig.org
+# File take from the VSCode repo at:
+# https://github.com/Microsoft/vscode/blob/master/.editorconfig
+
+# top-most EditorConfig file
+root = true
+
+# Tab indentation
+[*]
+indent_style = space
+indent_size = 4
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.md]
+trim_trailing_whitespace = false
+
+[*.xml]
+indent_size = 2
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
new file mode 100644
index 000000000..ad136dfa8
--- /dev/null
+++ b/.github/CODEOWNERS
@@ -0,0 +1,15 @@
+# Lines starting with '#' are comments.
+# Each line is a file pattern followed by one or more owners.
+
+# More details are here: https://help.github.com/articles/about-codeowners/
+
+# The '*' pattern is global owners.
+
+# Order is important. The last matching pattern has the most precedence.
+# The folders are ordered as follows:
+
+# In each subsection folders are ordered first by depth, then alphabetically.
+# This should make it easy to add new rules without breaking existing ones.
+
+# Global rule:
+* @microsoft/botframework-sdk
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/java-sdk-bug-report.md b/.github/ISSUE_TEMPLATE/java-sdk-bug-report.md
index a1c32e556..f34d7c975 100644
--- a/.github/ISSUE_TEMPLATE/java-sdk-bug-report.md
+++ b/.github/ISSUE_TEMPLATE/java-sdk-bug-report.md
@@ -1,9 +1,13 @@
---
name: Java SDK Bug Report
about: Create a bug report for a bug you found in the Bot Builder Java SDK
-
+title: ""
+labels: "needs-triage, bug"
+assignees: ""
---
+### [Github issues](https://github.com/microsoft/botbuilder-java/issues) should be used for bugs and feature requests. Use [Stack Overflow](https://stackoverflow.com/questions/tagged/botframework) for general "how-to" questions.
+
## Version
What package version of the SDK are you using.
@@ -25,5 +29,3 @@ If applicable, add screenshots to help explain your problem.
## Additional context
Add any other context about the problem here.
-
-[bug]
diff --git a/.github/ISSUE_TEMPLATE/java-sdk-feature-request.md b/.github/ISSUE_TEMPLATE/java-sdk-feature-request.md
index 90b1f7b7a..b12c217c2 100644
--- a/.github/ISSUE_TEMPLATE/java-sdk-feature-request.md
+++ b/.github/ISSUE_TEMPLATE/java-sdk-feature-request.md
@@ -1,9 +1,13 @@
---
name: Java SDK Feature Request
about: 'Suggest a feature for the Bot Builder Java SDK '
-
+title: ""
+labels: "needs-triage, feature-request"
+assignees: ""
---
+### Use this [query](https://github.com/microsoft/botbuilder-java/issues?q=is%3Aissue+is%3Aopen++label%3Afeature-request+) to search for the most popular feature requests.
+
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
@@ -15,5 +19,3 @@ A clear and concise description of any alternative solutions or features you've
**Additional context**
Add any other context or screenshots about the feature request here.
-
-[enhancement]
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 000000000..e8870cd7e
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,14 @@
+Fixes #
+
+## Description
+
+
+## Specific Changes
+
+
+ -
+ -
+ -
+
+## Testing
+
\ No newline at end of file
diff --git a/.github/workflows/create-parity-issue.yml b/.github/workflows/create-parity-issue.yml
new file mode 100644
index 000000000..51f47a190
--- /dev/null
+++ b/.github/workflows/create-parity-issue.yml
@@ -0,0 +1,43 @@
+name: create-parity-issue.yml
+
+on:
+ workflow_dispatch:
+ inputs:
+ prDescription:
+ description: PR description
+ default: 'No description provided'
+ required: true
+ prNumber:
+ description: PR number
+ required: true
+ prTitle:
+ description: PR title
+ required: true
+ sourceRepo:
+ description: repository PR is sourced from
+ required: true
+
+jobs:
+ createIssue:
+ name: create issue
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v2
+
+ - uses: joshgummersall/create-issue@main
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ title: |
+ port: ${{ github.event.inputs.prTitle }} (#${{ github.event.inputs.prNumber }})
+ labels: |
+ ["parity", "needs-triage", "ExemptFromDailyDRIReport"]
+ body: |
+ The changes in [${{ github.event.inputs.prTitle }} (#${{ github.event.inputs.prNumber }})](https://github.com/${{ github.event.inputs.sourceRepo }}/pull/${{ github.event.inputs.prNumber }}) may need to be ported to maintain parity with `${{ github.event.inputs.sourceRepo }}`.
+
+
+ ${{ github.event.inputs.prDescription }}
+
+
+ Please review and, if necessary, port the changes.
diff --git a/.github/workflows/pr-style.yml b/.github/workflows/pr-style.yml
new file mode 100644
index 000000000..51dbf531a
--- /dev/null
+++ b/.github/workflows/pr-style.yml
@@ -0,0 +1,18 @@
+name: pr-style.yml
+
+on:
+ pull_request:
+ types: [opened, edited, synchronize]
+
+jobs:
+ prStyle:
+ name: pr-style
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: joshgummersall/pr-style@main
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ require_issue: "true"
+ skip_authors: "dependabot"
diff --git a/.gitignore b/.gitignore
index 9d6304e11..d80f28b79 100644
--- a/.gitignore
+++ b/.gitignore
@@ -53,4 +53,19 @@ target
Thumbs.db
# reduced pom files should not be included
-dependency-reduced-pom.xml
\ No newline at end of file
+dependency-reduced-pom.xml
+*.factorypath
+.vscode/settings.json
+pom.xml.versionsBackup
+libraries/swagger/generated
+/javabotframework_pub.gpg
+/javabotframework_sec.gpg
+/private.pgp
+/privatekey.txt
+/public.pgp
+/.vs/slnx.sqlite
+/.vs/botbuilder-java/v16/.suo
+/.vs/ProjectSettings.json
+/.vs/botbuilder-java/v16/TestStore/0/000.testlog
+/.vs/botbuilder-java/v16/TestStore/0/testlog.manifest
+/.vs/VSWorkspaceState.json
diff --git a/.vscode/settings.json b/.vscode/settings.json
deleted file mode 100644
index c5f3f6b9c..000000000
--- a/.vscode/settings.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "java.configuration.updateBuildConfiguration": "interactive"
-}
\ No newline at end of file
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 000000000..f9ba8cf65
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,9 @@
+# Microsoft Open Source Code of Conduct
+
+This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).
+
+Resources:
+
+- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/)
+- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)
+- Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns
diff --git a/Contributing.md b/Contributing.md
new file mode 100644
index 000000000..41a2e6153
--- /dev/null
+++ b/Contributing.md
@@ -0,0 +1,23 @@
+# Instructions for Contributing Code
+
+## Contributing bug fixes and features
+
+The Bot Framework team is currently accepting contributions in the form of bug fixes and new
+features. Any submission must have an issue tracking it in the issue tracker that has
+ been approved by the Bot Framework team. Your pull request should include a link to
+ the bug that you are fixing. If you've submitted a PR for a bug, please post a
+ comment in the bug to avoid duplication of effort.
+
+## Legal
+
+If your contribution is more than 15 lines of code, you will need to complete a Contributor
+License Agreement (CLA). Briefly, this agreement testifies that you are granting us permission
+ to use the submitted change according to the terms of the project's license, and that the work
+ being submitted is under appropriate copyright.
+
+Please submit a Contributor License Agreement (CLA) before submitting a pull request.
+You may visit https://cla.azure.com to sign digitally. Alternatively, download the
+agreement ([Microsoft Contribution License Agreement.docx](https://www.codeplex.com/Download?ProjectName=typescript&DownloadId=822190) or
+ [Microsoft Contribution License Agreement.pdf](https://www.codeplex.com/Download?ProjectName=typescript&DownloadId=921298)), sign, scan,
+ and email it back to . Be sure to include your github user name along with the agreement. Once we have received the
+ signed CLA, we'll review the request.
\ No newline at end of file
diff --git a/Generator/generator-botbuilder-java/.editorconfig b/Generator/generator-botbuilder-java/.editorconfig
deleted file mode 100644
index beffa3084..000000000
--- a/Generator/generator-botbuilder-java/.editorconfig
+++ /dev/null
@@ -1,11 +0,0 @@
-root = true
-
-[*]
-indent_style = space
-indent_size = 2
-charset = utf-8
-trim_trailing_whitespace = true
-insert_final_newline = true
-
-[*.md]
-trim_trailing_whitespace = false
diff --git a/Generator/generator-botbuilder-java/.eslintignore b/Generator/generator-botbuilder-java/.eslintignore
deleted file mode 100644
index 515dfdf4f..000000000
--- a/Generator/generator-botbuilder-java/.eslintignore
+++ /dev/null
@@ -1,2 +0,0 @@
-coverage
-**/templates
diff --git a/Generator/generator-botbuilder-java/.gitattributes b/Generator/generator-botbuilder-java/.gitattributes
deleted file mode 100644
index 176a458f9..000000000
--- a/Generator/generator-botbuilder-java/.gitattributes
+++ /dev/null
@@ -1 +0,0 @@
-* text=auto
diff --git a/Generator/generator-botbuilder-java/.travis.yml b/Generator/generator-botbuilder-java/.travis.yml
deleted file mode 100644
index 335ea2d0a..000000000
--- a/Generator/generator-botbuilder-java/.travis.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-language: node_js
-node_js:
- - v10
- - v8
- - v6
- - v4
-after_script: cat ./coverage/lcov.info | coveralls
diff --git a/Generator/generator-botbuilder-java/.yo-rc.json b/Generator/generator-botbuilder-java/.yo-rc.json
deleted file mode 100644
index 0904532be..000000000
--- a/Generator/generator-botbuilder-java/.yo-rc.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "generator-node": {
- "promptValues": {
- "authorName": "Microsoft",
- "authorEmail": "",
- "authorUrl": ""
- }
- }
-}
\ No newline at end of file
diff --git a/Generator/generator-botbuilder-java/LICENSE b/Generator/generator-botbuilder-java/LICENSE
deleted file mode 100644
index 08ea44557..000000000
--- a/Generator/generator-botbuilder-java/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2018 Microsoft
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION 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/Generator/generator-botbuilder-java/README.md b/Generator/generator-botbuilder-java/README.md
deleted file mode 100644
index 4796cad67..000000000
--- a/Generator/generator-botbuilder-java/README.md
+++ /dev/null
@@ -1,38 +0,0 @@
-# generator-botbuilder-java [![NPM version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Dependency Status][daviddm-image]][daviddm-url] [![Coverage percentage][coveralls-image]][coveralls-url]
-> Template to create conversational bots in Java using Microsoft Bot Framework.
-
-## Installation
-
-First, install [Yeoman](http://yeoman.io) and generator-botbuilder-java using [npm](https://www.npmjs.com/) (we assume you have pre-installed [node.js](https://nodejs.org/)).
-
-```bash
-npm install -g yo
-npm install -g generator-botbuilder-java
-```
-
-Then generate your new project:
-
-```bash
-yo botbuilder-java
-```
-
-## Getting To Know Yeoman
-
- * Yeoman has a heart of gold.
- * Yeoman is a person with feelings and opinions, but is very easy to work with.
- * Yeoman can be too opinionated at times but is easily convinced not to be.
- * Feel free to [learn more about Yeoman](http://yeoman.io/).
-
-## License
-
-MIT © [Microsoft]()
-
-
-[npm-image]: https://badge.fury.io/js/generator-botbuilder-java.svg
-[npm-url]: https://npmjs.org/package/generator-botbuilder-java
-[travis-image]: https://travis-ci.org/Microsoft/generator-botbuilder-java.svg?branch=master
-[travis-url]: https://travis-ci.org/Microsoft/generator-botbuilder-java
-[daviddm-image]: https://david-dm.org/Microsoft/generator-botbuilder-java.svg?theme=shields.io
-[daviddm-url]: https://david-dm.org/Microsoft/generator-botbuilder-java
-[coveralls-image]: https://coveralls.io/repos/Microsoft/generator-botbuilder-java/badge.svg
-[coveralls-url]: https://coveralls.io/r/Microsoft/generator-botbuilder-java
diff --git a/Generator/generator-botbuilder-java/__tests__/app.js b/Generator/generator-botbuilder-java/__tests__/app.js
deleted file mode 100644
index 72f8b04db..000000000
--- a/Generator/generator-botbuilder-java/__tests__/app.js
+++ /dev/null
@@ -1,16 +0,0 @@
-'use strict';
-const path = require('path');
-const assert = require('yeoman-assert');
-const helpers = require('yeoman-test');
-
-describe('generator-botbuilder-java:app', () => {
- beforeAll(() => {
- return helpers
- .run(path.join(__dirname, '../generators/app'))
- .withPrompts({ someAnswer: true });
- });
-
- it('creates files', () => {
- assert.file(['dummyfile.txt']);
- });
-});
diff --git a/Generator/generator-botbuilder-java/generators/app/index.js b/Generator/generator-botbuilder-java/generators/app/index.js
deleted file mode 100644
index 59930463f..000000000
--- a/Generator/generator-botbuilder-java/generators/app/index.js
+++ /dev/null
@@ -1,49 +0,0 @@
-'use strict';
-const Generator = require('yeoman-generator');
-const chalk = require('chalk');
-const yosay = require('yosay');
-const path = require('path');
-const _ = require('lodash');
-const extend = require('deep-extend');
-const mkdirp = require('mkdirp');
-
-module.exports = class extends Generator {
- prompting() {
- // Have Yeoman greet the user.
- this.log(
- yosay(`Welcome to the badass ${chalk.red('generator-botbuilder-java')} generator!`)
- );
-
- const prompts = [
- { name: 'botName', message: `What 's the name of your bot?`, default: 'sample' },
- { name: 'description', message: 'What will your bot do?', default: 'sample' },
- { name: 'dialog', type: 'list', message: 'What default dialog do you want?', choices: ['Echo'] },
- ];
-
- return this.prompt(prompts).then(props => {
- // To access props later use this.props.someAnswer;
- this.props = props;
- });
- }
-
- writing() {
- const directoryName = _.kebabCase(this.props.botName);
- const defaultDialog = this.props.dialog.split(' ')[0].toLowerCase();
-
- if (path.basename(this.destinationPath()) !== directoryName) {
- this.log(`Your bot should be in a directory named ${directoryName}\nI'll automatically create this folder.`);
- mkdirp(directoryName);
- this.destinationRoot(this.destinationPath(directoryName));
- }
-
- this.fs.copyTpl(this.templatePath('pom.xml'), this.destinationPath('pom.xml'), { botName: directoryName });
- this.fs.copy(this.templatePath(`app.java`), this.destinationPath(`app.java`));
- this.fs.copyTpl(this.templatePath('README.md'), this.destinationPath('README.md'), {
- botName: this.props.botName, description: this.props.description
- });
- }
-
- install() {
- this.installDependencies({bower: false});
- }
-};
diff --git a/Generator/generator-botbuilder-java/generators/app/templates/README.md b/Generator/generator-botbuilder-java/generators/app/templates/README.md
deleted file mode 100644
index 47ace33f4..000000000
--- a/Generator/generator-botbuilder-java/generators/app/templates/README.md
+++ /dev/null
@@ -1,37 +0,0 @@
-# <%= botName %> Bot
-
-This bot has been created using [Microsoft Bot Framework](https://dev.botframework.com),
-
-This bot is designed to do the following:
-
-<%= description %>
-
-## About the generator
-
-The goal of the BotBuilder Yeoman generator is to both scaffold out a bot according to general best practices, and to provide some templates you can use when implementing commonly requested features and dialogs in your bot.
-
-### Dialogs
-
-This generator provides the following dialogs:
-- Echo Dialog, for simple bots
-
-## Getting Started
-
-### Dependencies
-
-### Structure
-
-### Configuring the bot
-
-### The dialogs
-
-- Echo dialog is designed for simple Hello, World demos and to get you started.
-
-### Running the bot
-
-## Additional Resources
-
-- [Microsoft Virtual Academy Bots Course](http://aka.ms/botcourse)
-- [Bot Framework Documentation](https://docs.botframework.com)
-- [LUIS](https://luis.ai)
-- [QnA Maker](https://qnamaker.ai)
\ No newline at end of file
diff --git a/Generator/generator-botbuilder-java/generators/app/templates/app.java b/Generator/generator-botbuilder-java/generators/app/templates/app.java
deleted file mode 100644
index 65584b463..000000000
--- a/Generator/generator-botbuilder-java/generators/app/templates/app.java
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT License.
-
-package com.microsoft.bot.connector.sample;
-
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.microsoft.aad.adal4j.AuthenticationException;
-import com.microsoft.bot.connector.customizations.CredentialProvider;
-import com.microsoft.bot.connector.customizations.CredentialProviderImpl;
-import com.microsoft.bot.connector.customizations.JwtTokenValidation;
-import com.microsoft.bot.connector.customizations.MicrosoftAppCredentials;
-import com.microsoft.bot.connector.implementation.ConnectorClientImpl;
-import com.microsoft.bot.schema.models.Activity;
-import com.microsoft.bot.schema.models.ActivityTypes;
-import com.microsoft.bot.schema.models.ResourceResponse;
-import com.sun.net.httpserver.HttpExchange;
-import com.sun.net.httpserver.HttpHandler;
-import com.sun.net.httpserver.HttpServer;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.InetSocketAddress;
-import java.net.URLDecoder;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-public class App {
- private static final Logger LOGGER = Logger.getLogger( App.class.getName() );
- private static String appId = ""; // <-- app id -->
- private static String appPassword = ""; // <-- app password -->
-
- public static void main( String[] args ) throws IOException {
- CredentialProvider credentialProvider = new CredentialProviderImpl(appId, appPassword);
- HttpServer server = HttpServer.create(new InetSocketAddress(3978), 0);
- server.createContext("/api/messages", new MessageHandle(credentialProvider));
- server.setExecutor(null);
- server.start();
- }
-
- static class MessageHandle implements HttpHandler {
- private ObjectMapper objectMapper;
- private CredentialProvider credentialProvider;
- private MicrosoftAppCredentials credentials;
-
- MessageHandle(CredentialProvider credentialProvider) {
- this.objectMapper = new ObjectMapper()
- .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
- .findAndRegisterModules();
- this.credentialProvider = credentialProvider;
- this.credentials = new MicrosoftAppCredentials(appId, appPassword);
- }
-
- public void handle(HttpExchange httpExchange) throws IOException {
- if (httpExchange.getRequestMethod().equalsIgnoreCase("POST")) {
- Activity activity = getActivity(httpExchange);
- String authHeader = httpExchange.getRequestHeaders().getFirst("Authorization");
- try {
- JwtTokenValidation.assertValidActivity(activity, authHeader, credentialProvider);
-
- // send ack to user activity
- httpExchange.sendResponseHeaders(202, 0);
- httpExchange.getResponseBody().close();
-
- if (activity.type().equals(ActivityTypes.MESSAGE)) {
- // reply activity with the same text
- ConnectorClientImpl connector = new ConnectorClientImpl(activity.serviceUrl(), this.credentials);
- ResourceResponse response = connector.conversations().sendToConversation(activity.conversation().id(),
- new Activity()
- .withType(ActivityTypes.MESSAGE)
- .withText("Echo: " + activity.text())
- .withRecipient(activity.from())
- .withFrom(activity.recipient())
- );
- }
- } catch (AuthenticationException ex) {
- httpExchange.sendResponseHeaders(401, 0);
- httpExchange.getResponseBody().close();
- LOGGER.log(Level.WARNING, "Auth failed!", ex);
- } catch (Exception ex) {
- LOGGER.log(Level.WARNING, "Execution failed", ex);
- }
- }
- }
-
- private String getRequestBody(HttpExchange httpExchange) throws IOException {
- StringBuilder buffer = new StringBuilder();
- InputStream stream = httpExchange.getRequestBody();
- int rByte;
- while ((rByte = stream.read()) != -1) {
- buffer.append((char)rByte);
- }
- stream.close();
- if (buffer.length() > 0) {
- return URLDecoder.decode(buffer.toString(), "UTF-8");
- }
- return "";
- }
-
- private Activity getActivity(HttpExchange httpExchange) {
- try {
- String body = getRequestBody(httpExchange);
- LOGGER.log(Level.INFO, body);
- return objectMapper.readValue(body, Activity.class);
- } catch (Exception ex) {
- LOGGER.log(Level.WARNING, "Failed to get activity", ex);
- return null;
- }
-
- }
- }
-}
diff --git a/Generator/generator-botbuilder-java/generators/app/templates/pom.xml b/Generator/generator-botbuilder-java/generators/app/templates/pom.xml
deleted file mode 100644
index eaad9195d..000000000
--- a/Generator/generator-botbuilder-java/generators/app/templates/pom.xml
+++ /dev/null
@@ -1,89 +0,0 @@
-
- 4.0.0
-
- com.microsoft.bot.connector.sample
- bot-connector-sample
- jar
- 1.0.0
-
-
- com.microsoft.bot
- bot-parent
- 4.0.0-a0
- ../../
-
-
- bot-connector-sample
- http://maven.apache.org
-
-
- UTF-8
-
-
-
-
- junit
- junit
- 4.12
- test
-
-
- com.fasterxml.jackson.module
- jackson-module-parameter-names
- 2.9.2
-
-
- com.fasterxml.jackson.datatype
- jackson-datatype-jdk8
- 2.9.2
-
-
- com.fasterxml.jackson.datatype
- jackson-datatype-jsr310
- 2.9.2
-
-
- org.slf4j
- slf4j-api
- LATEST
-
-
- org.slf4j
- slf4j-simple
- LATEST
-
-
- com.microsoft.bot.schema
- botbuilder-schema
- 4.0.0-a0
-
-
- com.microsoft.bot.connector
- bot-connector
- 4.0.0-a0
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- 3.7.0
-
- 1.8
- 1.8
-
-
-
- org.codehaus.mojo
- exec-maven-plugin
- 1.6.0
-
- com.microsoft.bot.connector.sample.App
-
-
-
-
-
\ No newline at end of file
diff --git a/Generator/generator-botbuilder-java/package-lock.json b/Generator/generator-botbuilder-java/package-lock.json
deleted file mode 100644
index a68a5382f..000000000
--- a/Generator/generator-botbuilder-java/package-lock.json
+++ /dev/null
@@ -1,9106 +0,0 @@
-{
- "name": "generator-botbuilder-java",
- "version": "0.0.0",
- "lockfileVersion": 1,
- "requires": true,
- "dependencies": {
- "@babel/code-frame": {
- "version": "7.0.0-beta.40",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.40.tgz",
- "integrity": "sha512-eVXQSbu/RimU6OKcK2/gDJVTFcxXJI4sHbIqw2mhwMZeQ2as/8AhS9DGkEDoHMBBNJZ5B0US63lF56x+KDcxiA==",
- "dev": true,
- "requires": {
- "@babel/highlight": "7.0.0-beta.40"
- }
- },
- "@babel/highlight": {
- "version": "7.0.0-beta.40",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.40.tgz",
- "integrity": "sha512-mOhhTrzieV6VO7odgzFGFapiwRK0ei8RZRhfzHhb6cpX3QM8XXuCLXWjN8qBB7JReDdUR80V3LFfFrGUYevhNg==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.0",
- "esutils": "^2.0.2",
- "js-tokens": "^3.0.0"
- }
- },
- "abab": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz",
- "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=",
- "dev": true
- },
- "acorn": {
- "version": "5.5.3",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz",
- "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==",
- "dev": true
- },
- "acorn-globals": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.1.0.tgz",
- "integrity": "sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ==",
- "dev": true,
- "requires": {
- "acorn": "^5.0.0"
- }
- },
- "acorn-jsx": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
- "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
- "dev": true,
- "requires": {
- "acorn": "^3.0.4"
- },
- "dependencies": {
- "acorn": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
- "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
- "dev": true
- }
- }
- },
- "ajv": {
- "version": "5.5.2",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
- "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
- "dev": true,
- "requires": {
- "co": "^4.6.0",
- "fast-deep-equal": "^1.0.0",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.3.0"
- }
- },
- "ajv-keywords": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
- "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=",
- "dev": true
- },
- "align-text": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
- "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2",
- "longest": "^1.0.1",
- "repeat-string": "^1.5.2"
- }
- },
- "amdefine": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
- "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
- "dev": true
- },
- "ansi-escapes": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
- "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw=="
- },
- "ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
- },
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "any-observable": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.2.0.tgz",
- "integrity": "sha1-xnhwBYADV5AJCD9UrAq6+1wz0kI=",
- "dev": true
- },
- "anymatch": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
- "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
- "dev": true,
- "requires": {
- "micromatch": "^3.1.4",
- "normalize-path": "^2.1.1"
- },
- "dependencies": {
- "arr-diff": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
- "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
- "dev": true
- },
- "array-unique": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
- "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
- "dev": true
- },
- "braces": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
- "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
- "dev": true,
- "requires": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "expand-brackets": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
- "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
- "dev": true,
- "requires": {
- "debug": "^2.3.3",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "posix-character-classes": "^0.1.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
- "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "is-data-descriptor": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
- "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "is-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
- "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^0.1.6",
- "is-data-descriptor": "^0.1.4",
- "kind-of": "^5.0.0"
- }
- },
- "kind-of": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
- "dev": true
- }
- }
- },
- "extglob": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
- "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
- "dev": true,
- "requires": {
- "array-unique": "^0.3.2",
- "define-property": "^1.0.0",
- "expand-brackets": "^2.1.4",
- "extend-shallow": "^2.0.1",
- "fragment-cache": "^0.2.1",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "fill-range": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
- "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
- "dev": true,
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- },
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- },
- "kind-of": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
- "dev": true
- },
- "micromatch": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
- "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
- "dev": true,
- "requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "braces": "^2.3.1",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "extglob": "^2.0.4",
- "fragment-cache": "^0.2.1",
- "kind-of": "^6.0.2",
- "nanomatch": "^1.2.9",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
- }
- },
- "normalize-path": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
- "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
- "dev": true,
- "requires": {
- "remove-trailing-separator": "^1.0.1"
- }
- }
- }
- },
- "app-root-path": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.0.1.tgz",
- "integrity": "sha1-zWLc+OT9WkF+/GZNLlsQZTxlG0Y=",
- "dev": true
- },
- "append-transform": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz",
- "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=",
- "dev": true,
- "requires": {
- "default-require-extensions": "^1.0.0"
- }
- },
- "argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "requires": {
- "sprintf-js": "~1.0.2"
- }
- },
- "arr-diff": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
- "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
- "dev": true,
- "requires": {
- "arr-flatten": "^1.0.1"
- }
- },
- "arr-flatten": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
- "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
- "dev": true
- },
- "arr-union": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
- "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
- "dev": true
- },
- "array-differ": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz",
- "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE="
- },
- "array-equal": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
- "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=",
- "dev": true
- },
- "array-union": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
- "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
- "requires": {
- "array-uniq": "^1.0.1"
- }
- },
- "array-uniq": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
- "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
- },
- "array-unique": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
- "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
- "dev": true
- },
- "arrify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
- "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
- },
- "asn1": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
- "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=",
- "dev": true
- },
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
- "dev": true
- },
- "assign-symbols": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
- "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
- "dev": true
- },
- "astral-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
- "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
- "dev": true
- },
- "async": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
- "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
- "requires": {
- "lodash": "^4.14.0"
- }
- },
- "async-limiter": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
- "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==",
- "dev": true
- },
- "asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
- "dev": true
- },
- "atob": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz",
- "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==",
- "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=",
- "dev": true
- },
- "aws4": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz",
- "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==",
- "dev": true
- },
- "babel-code-frame": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
- "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
- "dev": true,
- "requires": {
- "chalk": "^1.1.3",
- "esutils": "^2.0.2",
- "js-tokens": "^3.0.2"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "dev": true
- },
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dev": true,
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "dev": true,
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
- "dev": true
- }
- }
- },
- "babel-core": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz",
- "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=",
- "dev": true,
- "requires": {
- "babel-code-frame": "^6.26.0",
- "babel-generator": "^6.26.0",
- "babel-helpers": "^6.24.1",
- "babel-messages": "^6.23.0",
- "babel-register": "^6.26.0",
- "babel-runtime": "^6.26.0",
- "babel-template": "^6.26.0",
- "babel-traverse": "^6.26.0",
- "babel-types": "^6.26.0",
- "babylon": "^6.18.0",
- "convert-source-map": "^1.5.0",
- "debug": "^2.6.8",
- "json5": "^0.5.1",
- "lodash": "^4.17.4",
- "minimatch": "^3.0.4",
- "path-is-absolute": "^1.0.1",
- "private": "^0.1.7",
- "slash": "^1.0.0",
- "source-map": "^0.5.6"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- }
- }
- },
- "babel-generator": {
- "version": "6.26.1",
- "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
- "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
- "dev": true,
- "requires": {
- "babel-messages": "^6.23.0",
- "babel-runtime": "^6.26.0",
- "babel-types": "^6.26.0",
- "detect-indent": "^4.0.0",
- "jsesc": "^1.3.0",
- "lodash": "^4.17.4",
- "source-map": "^0.5.7",
- "trim-right": "^1.0.1"
- }
- },
- "babel-helpers": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
- "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1"
- }
- },
- "babel-jest": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-22.4.3.tgz",
- "integrity": "sha512-BgSjmtl3mW3i+VeVHEr9d2zFSAT66G++pJcHQiUjd00pkW+voYXFctIm/indcqOWWXw5a1nUpR1XWszD9fJ1qg==",
- "dev": true,
- "requires": {
- "babel-plugin-istanbul": "^4.1.5",
- "babel-preset-jest": "^22.4.3"
- }
- },
- "babel-messages": {
- "version": "6.23.0",
- "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
- "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0"
- }
- },
- "babel-plugin-istanbul": {
- "version": "4.1.6",
- "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz",
- "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==",
- "dev": true,
- "requires": {
- "babel-plugin-syntax-object-rest-spread": "^6.13.0",
- "find-up": "^2.1.0",
- "istanbul-lib-instrument": "^1.10.1",
- "test-exclude": "^4.2.1"
- }
- },
- "babel-plugin-jest-hoist": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.3.tgz",
- "integrity": "sha512-zhvv4f6OTWy2bYevcJftwGCWXMFe7pqoz41IhMi4xna7xNsX5NygdagsrE0y6kkfuXq8UalwvPwKTyAxME2E/g==",
- "dev": true
- },
- "babel-plugin-syntax-object-rest-spread": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz",
- "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=",
- "dev": true
- },
- "babel-preset-jest": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-22.4.3.tgz",
- "integrity": "sha512-a+M3LTEXTq3gxv0uBN9Qm6ahUl7a8pj923nFbCUdqFUSsf3YrX8Uc+C3MEwji5Af3LiQjSC7w4ooYewlz8HRTA==",
- "dev": true,
- "requires": {
- "babel-plugin-jest-hoist": "^22.4.3",
- "babel-plugin-syntax-object-rest-spread": "^6.13.0"
- }
- },
- "babel-register": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
- "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
- "dev": true,
- "requires": {
- "babel-core": "^6.26.0",
- "babel-runtime": "^6.26.0",
- "core-js": "^2.5.0",
- "home-or-tmp": "^2.0.0",
- "lodash": "^4.17.4",
- "mkdirp": "^0.5.1",
- "source-map-support": "^0.4.15"
- },
- "dependencies": {
- "source-map-support": {
- "version": "0.4.18",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
- "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
- "dev": true,
- "requires": {
- "source-map": "^0.5.6"
- }
- }
- }
- },
- "babel-runtime": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
- "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
- "dev": true,
- "requires": {
- "core-js": "^2.4.0",
- "regenerator-runtime": "^0.11.0"
- }
- },
- "babel-template": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
- "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.26.0",
- "babel-traverse": "^6.26.0",
- "babel-types": "^6.26.0",
- "babylon": "^6.18.0",
- "lodash": "^4.17.4"
- }
- },
- "babel-traverse": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
- "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
- "dev": true,
- "requires": {
- "babel-code-frame": "^6.26.0",
- "babel-messages": "^6.23.0",
- "babel-runtime": "^6.26.0",
- "babel-types": "^6.26.0",
- "babylon": "^6.18.0",
- "debug": "^2.6.8",
- "globals": "^9.18.0",
- "invariant": "^2.2.2",
- "lodash": "^4.17.4"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "globals": {
- "version": "9.18.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
- "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
- "dev": true
- }
- }
- },
- "babel-types": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
- "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.26.0",
- "esutils": "^2.0.2",
- "lodash": "^4.17.4",
- "to-fast-properties": "^1.0.3"
- }
- },
- "babylon": {
- "version": "6.18.0",
- "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
- "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
- "dev": true
- },
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
- },
- "base": {
- "version": "0.11.2",
- "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
- "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
- "dev": true,
- "requires": {
- "cache-base": "^1.0.1",
- "class-utils": "^0.3.5",
- "component-emitter": "^1.2.1",
- "define-property": "^1.0.0",
- "isobject": "^3.0.1",
- "mixin-deep": "^1.2.0",
- "pascalcase": "^0.1.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- },
- "kind-of": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
- "dev": true
- }
- }
- },
- "bcrypt-pbkdf": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
- "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
- "dev": true,
- "optional": true,
- "requires": {
- "tweetnacl": "^0.14.3"
- }
- },
- "binaryextensions": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.1.1.tgz",
- "integrity": "sha512-XBaoWE9RW8pPdPQNibZsW2zh8TW6gcarXp1FZPwT8Uop8ScSNldJEWf2k9l3HeTqdrEwsOsFcq74RiJECW34yA=="
- },
- "boom": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz",
- "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=",
- "dev": true,
- "requires": {
- "hoek": "4.x.x"
- }
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "braces": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
- "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
- "dev": true,
- "requires": {
- "expand-range": "^1.8.1",
- "preserve": "^0.2.0",
- "repeat-element": "^1.1.2"
- }
- },
- "browser-process-hrtime": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz",
- "integrity": "sha1-Ql1opY00R/AqBKqJQYf86K+Le44=",
- "dev": true
- },
- "browser-resolve": {
- "version": "1.11.2",
- "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz",
- "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=",
- "dev": true,
- "requires": {
- "resolve": "1.1.7"
- },
- "dependencies": {
- "resolve": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
- "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
- "dev": true
- }
- }
- },
- "bser": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz",
- "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=",
- "dev": true,
- "requires": {
- "node-int64": "^0.4.0"
- }
- },
- "buffer-from": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz",
- "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==",
- "dev": true
- },
- "builtin-modules": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
- "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8="
- },
- "cache-base": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
- "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
- "dev": true,
- "requires": {
- "collection-visit": "^1.0.0",
- "component-emitter": "^1.2.1",
- "get-value": "^2.0.6",
- "has-value": "^1.0.0",
- "isobject": "^3.0.1",
- "set-value": "^2.0.0",
- "to-object-path": "^0.3.0",
- "union-value": "^1.0.0",
- "unset-value": "^1.0.0"
- },
- "dependencies": {
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- }
- }
- },
- "caller-path": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
- "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
- "dev": true,
- "requires": {
- "callsites": "^0.2.0"
- }
- },
- "callsites": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
- "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
- "dev": true
- },
- "camelcase": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
- "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
- "dev": true,
- "optional": true
- },
- "capture-stack-trace": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz",
- "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=",
- "dev": true
- },
- "caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
- "dev": true
- },
- "center-align": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
- "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
- "dev": true,
- "optional": true,
- "requires": {
- "align-text": "^0.1.3",
- "lazy-cache": "^1.0.3"
- }
- },
- "chalk": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.0.tgz",
- "integrity": "sha512-Wr/w0f4o9LuE7K53cD0qmbAMM+2XNLzR29vFn5hqko4sxGlUsyy363NvmyGIyk5tpe9cjTr9SJYbysEyPkRnFw==",
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "chardet": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
- "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I="
- },
- "ci-info": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz",
- "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==",
- "dev": true
- },
- "circular-json": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
- "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
- "dev": true
- },
- "class-extend": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/class-extend/-/class-extend-0.1.2.tgz",
- "integrity": "sha1-gFeoKwD1P4Kl1ixQ74z/3sb6vDQ=",
- "dev": true,
- "requires": {
- "object-assign": "^2.0.0"
- },
- "dependencies": {
- "object-assign": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz",
- "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=",
- "dev": true
- }
- }
- },
- "class-utils": {
- "version": "0.3.6",
- "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
- "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
- "dev": true,
- "requires": {
- "arr-union": "^3.1.0",
- "define-property": "^0.2.5",
- "isobject": "^3.0.0",
- "static-extend": "^0.1.1"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- }
- }
- },
- "cli-boxes": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz",
- "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM="
- },
- "cli-cursor": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
- "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
- "requires": {
- "restore-cursor": "^2.0.0"
- }
- },
- "cli-spinners": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz",
- "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=",
- "dev": true
- },
- "cli-table": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz",
- "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=",
- "requires": {
- "colors": "1.0.3"
- }
- },
- "cli-truncate": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz",
- "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=",
- "dev": true,
- "requires": {
- "slice-ansi": "0.0.4",
- "string-width": "^1.0.1"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "dev": true,
- "requires": {
- "number-is-nan": "^1.0.0"
- }
- },
- "slice-ansi": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz",
- "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=",
- "dev": true
- },
- "string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "dev": true,
- "requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "dev": true,
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- }
- }
- },
- "cli-width": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
- "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk="
- },
- "cliui": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
- "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
- "dev": true,
- "optional": true,
- "requires": {
- "center-align": "^0.1.1",
- "right-align": "^0.1.1",
- "wordwrap": "0.0.2"
- },
- "dependencies": {
- "wordwrap": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
- "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
- "dev": true,
- "optional": true
- }
- }
- },
- "clone": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
- "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18="
- },
- "clone-buffer": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
- "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg="
- },
- "clone-stats": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
- "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA="
- },
- "cloneable-readable": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz",
- "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==",
- "requires": {
- "inherits": "^2.0.1",
- "process-nextick-args": "^2.0.0",
- "readable-stream": "^2.3.5"
- }
- },
- "co": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
- "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
- "dev": true
- },
- "code-point-at": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
- "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
- },
- "collection-visit": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
- "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
- "dev": true,
- "requires": {
- "map-visit": "^1.0.0",
- "object-visit": "^1.0.0"
- }
- },
- "color-convert": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
- "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
- "requires": {
- "color-name": "^1.1.1"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
- },
- "colors": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
- "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs="
- },
- "combined-stream": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
- "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
- "dev": true,
- "requires": {
- "delayed-stream": "~1.0.0"
- }
- },
- "commander": {
- "version": "2.15.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
- "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
- "dev": true
- },
- "commondir": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
- "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs="
- },
- "compare-versions": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.1.0.tgz",
- "integrity": "sha512-4hAxDSBypT/yp2ySFD346So6Ragw5xmBn/e/agIGl3bZr6DLUqnoRZPusxKrXdYRZpgexO9daejmIenlq/wrIQ==",
- "dev": true
- },
- "component-emitter": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
- "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
- "dev": true
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "concat-stream": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
- "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
- "dev": true,
- "requires": {
- "buffer-from": "^1.0.0",
- "inherits": "^2.0.3",
- "readable-stream": "^2.2.2",
- "typedarray": "^0.0.6"
- }
- },
- "convert-source-map": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
- "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=",
- "dev": true
- },
- "copy-descriptor": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
- "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
- "dev": true
- },
- "core-js": {
- "version": "2.5.5",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
- "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=",
- "dev": true
- },
- "core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
- },
- "cosmiconfig": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz",
- "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==",
- "dev": true,
- "requires": {
- "is-directory": "^0.3.1",
- "js-yaml": "^3.9.0",
- "parse-json": "^4.0.0",
- "require-from-string": "^2.0.1"
- }
- },
- "coveralls": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.0.tgz",
- "integrity": "sha512-ZppXR9y5PraUOrf/DzHJY6gzNUhXYE3b9D43xEXs4QYZ7/Oe0Gy0CS+IPKWFfvQFXB3RG9QduaQUFehzSpGAFw==",
- "dev": true,
- "requires": {
- "js-yaml": "^3.6.1",
- "lcov-parse": "^0.0.10",
- "log-driver": "^1.2.5",
- "minimist": "^1.2.0",
- "request": "^2.79.0"
- }
- },
- "create-error-class": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
- "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
- "dev": true,
- "requires": {
- "capture-stack-trace": "^1.0.0"
- }
- },
- "cross-spawn": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
- "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
- "requires": {
- "lru-cache": "^4.0.1",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- }
- },
- "cryptiles": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz",
- "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=",
- "dev": true,
- "requires": {
- "boom": "5.x.x"
- },
- "dependencies": {
- "boom": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz",
- "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==",
- "dev": true,
- "requires": {
- "hoek": "4.x.x"
- }
- }
- }
- },
- "cssom": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz",
- "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=",
- "dev": true
- },
- "cssstyle": {
- "version": "0.2.37",
- "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz",
- "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=",
- "dev": true,
- "requires": {
- "cssom": "0.3.x"
- }
- },
- "dargs": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/dargs/-/dargs-5.1.0.tgz",
- "integrity": "sha1-7H6lDHhWTNNsnV7Bj2Yyn63ieCk="
- },
- "dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0"
- }
- },
- "data-urls": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.0.0.tgz",
- "integrity": "sha512-ai40PPQR0Fn1lD2PPie79CibnlMN2AYiDhwFX/rZHVsxbs5kNJSjegqXIprhouGXlRdEnfybva7kqRGnB6mypA==",
- "dev": true,
- "requires": {
- "abab": "^1.0.4",
- "whatwg-mimetype": "^2.0.0",
- "whatwg-url": "^6.4.0"
- }
- },
- "date-fns": {
- "version": "1.29.0",
- "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz",
- "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==",
- "dev": true
- },
- "dateformat": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
- "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q=="
- },
- "debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
- "dev": true
- },
- "decode-uri-component": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
- "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
- "dev": true
- },
- "decompress-response": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
- "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
- "requires": {
- "mimic-response": "^1.0.0"
- }
- },
- "dedent": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
- "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=",
- "dev": true
- },
- "deep-extend": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
- "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8="
- },
- "deep-is": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
- "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
- "dev": true
- },
- "default-require-extensions": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz",
- "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=",
- "dev": true,
- "requires": {
- "strip-bom": "^2.0.0"
- },
- "dependencies": {
- "strip-bom": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
- "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
- "dev": true,
- "requires": {
- "is-utf8": "^0.2.0"
- }
- }
- }
- },
- "define-properties": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz",
- "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=",
- "dev": true,
- "requires": {
- "foreach": "^2.0.5",
- "object-keys": "^1.0.8"
- }
- },
- "define-property": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
- "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
- "dev": true,
- "requires": {
- "is-descriptor": "^1.0.2",
- "isobject": "^3.0.1"
- },
- "dependencies": {
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- },
- "kind-of": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
- "dev": true
- }
- }
- },
- "del": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
- "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
- "dev": true,
- "requires": {
- "globby": "^5.0.0",
- "is-path-cwd": "^1.0.0",
- "is-path-in-cwd": "^1.0.0",
- "object-assign": "^4.0.1",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0",
- "rimraf": "^2.2.8"
- },
- "dependencies": {
- "globby": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
- "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
- "dev": true,
- "requires": {
- "array-union": "^1.0.1",
- "arrify": "^1.0.0",
- "glob": "^7.0.3",
- "object-assign": "^4.0.1",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- }
- },
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
- "dev": true
- }
- }
- },
- "delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
- "dev": true
- },
- "detect-conflict": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/detect-conflict/-/detect-conflict-1.0.1.tgz",
- "integrity": "sha1-CIZXpmqWHAUBnbfEIwiDsca0F24="
- },
- "detect-indent": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
- "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
- "dev": true,
- "requires": {
- "repeating": "^2.0.0"
- }
- },
- "detect-newline": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz",
- "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=",
- "dev": true
- },
- "diff": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
- "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA=="
- },
- "doctrine": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
- "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
- "dev": true,
- "requires": {
- "esutils": "^2.0.2"
- }
- },
- "domexception": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz",
- "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==",
- "dev": true,
- "requires": {
- "webidl-conversions": "^4.0.2"
- }
- },
- "duplexer3": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
- "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
- },
- "ecc-jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
- "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
- "dev": true,
- "optional": true,
- "requires": {
- "jsbn": "~0.1.0"
- }
- },
- "editions": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz",
- "integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg=="
- },
- "ejs": {
- "version": "2.5.9",
- "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.9.tgz",
- "integrity": "sha512-GJCAeDBKfREgkBtgrYSf9hQy9kTb3helv0zGdzqhM7iAkW8FA/ZF97VQDbwFiwIT8MQLLOe5VlPZOEvZAqtUAQ=="
- },
- "elegant-spinner": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz",
- "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=",
- "dev": true
- },
- "error": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz",
- "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=",
- "requires": {
- "string-template": "~0.2.1",
- "xtend": "~4.0.0"
- }
- },
- "error-ex": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
- "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
- "requires": {
- "is-arrayish": "^0.2.1"
- }
- },
- "es-abstract": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.11.0.tgz",
- "integrity": "sha512-ZnQrE/lXTTQ39ulXZ+J1DTFazV9qBy61x2bY071B+qGco8Z8q1QddsLdt/EF8Ai9hcWH72dWS0kFqXLxOxqslA==",
- "dev": true,
- "requires": {
- "es-to-primitive": "^1.1.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.1",
- "is-callable": "^1.1.3",
- "is-regex": "^1.0.4"
- }
- },
- "es-to-primitive": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz",
- "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=",
- "dev": true,
- "requires": {
- "is-callable": "^1.1.1",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.1"
- }
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
- },
- "escodegen": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
- "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
- "dev": true,
- "requires": {
- "esprima": "^3.1.3",
- "estraverse": "^4.2.0",
- "esutils": "^2.0.2",
- "optionator": "^0.8.1",
- "source-map": "~0.6.1"
- },
- "dependencies": {
- "esprima": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
- "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
- "dev": true
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true,
- "optional": true
- }
- }
- },
- "eslint": {
- "version": "4.19.1",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz",
- "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==",
- "dev": true,
- "requires": {
- "ajv": "^5.3.0",
- "babel-code-frame": "^6.22.0",
- "chalk": "^2.1.0",
- "concat-stream": "^1.6.0",
- "cross-spawn": "^5.1.0",
- "debug": "^3.1.0",
- "doctrine": "^2.1.0",
- "eslint-scope": "^3.7.1",
- "eslint-visitor-keys": "^1.0.0",
- "espree": "^3.5.4",
- "esquery": "^1.0.0",
- "esutils": "^2.0.2",
- "file-entry-cache": "^2.0.0",
- "functional-red-black-tree": "^1.0.1",
- "glob": "^7.1.2",
- "globals": "^11.0.1",
- "ignore": "^3.3.3",
- "imurmurhash": "^0.1.4",
- "inquirer": "^3.0.6",
- "is-resolvable": "^1.0.0",
- "js-yaml": "^3.9.1",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.3.0",
- "lodash": "^4.17.4",
- "minimatch": "^3.0.2",
- "mkdirp": "^0.5.1",
- "natural-compare": "^1.4.0",
- "optionator": "^0.8.2",
- "path-is-inside": "^1.0.2",
- "pluralize": "^7.0.0",
- "progress": "^2.0.0",
- "regexpp": "^1.0.1",
- "require-uncached": "^1.0.3",
- "semver": "^5.3.0",
- "strip-ansi": "^4.0.0",
- "strip-json-comments": "~2.0.1",
- "table": "4.0.2",
- "text-table": "~0.2.0"
- }
- },
- "eslint-config-prettier": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-2.9.0.tgz",
- "integrity": "sha512-ag8YEyBXsm3nmOv1Hz991VtNNDMRa+MNy8cY47Pl4bw6iuzqKbJajXdqUpiw13STdLLrznxgm1hj9NhxeOYq0A==",
- "dev": true,
- "requires": {
- "get-stdin": "^5.0.1"
- },
- "dependencies": {
- "get-stdin": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz",
- "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=",
- "dev": true
- }
- }
- },
- "eslint-config-xo": {
- "version": "0.20.1",
- "resolved": "https://registry.npmjs.org/eslint-config-xo/-/eslint-config-xo-0.20.1.tgz",
- "integrity": "sha512-bhDRezvlbYNZn8SHv0WE8aPsdPtH3sq1IU2SznyOtmRwi6e/XQkzs+Kaw1hA9Pz4xmkG796egIsFY2RD6fwUeQ==",
- "dev": true
- },
- "eslint-plugin-prettier": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-2.6.0.tgz",
- "integrity": "sha512-floiaI4F7hRkTrFe8V2ItOK97QYrX75DjmdzmVITZoAP6Cn06oEDPQRsO6MlHEP/u2SxI3xQ52Kpjw6j5WGfeQ==",
- "dev": true,
- "requires": {
- "fast-diff": "^1.1.1",
- "jest-docblock": "^21.0.0"
- }
- },
- "eslint-scope": {
- "version": "3.7.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz",
- "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=",
- "dev": true,
- "requires": {
- "esrecurse": "^4.1.0",
- "estraverse": "^4.1.1"
- }
- },
- "eslint-visitor-keys": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
- "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
- "dev": true
- },
- "espree": {
- "version": "3.5.4",
- "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz",
- "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==",
- "dev": true,
- "requires": {
- "acorn": "^5.5.0",
- "acorn-jsx": "^3.0.0"
- }
- },
- "esprima": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
- "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==",
- "dev": true
- },
- "esquery": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
- "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
- "dev": true,
- "requires": {
- "estraverse": "^4.0.0"
- }
- },
- "esrecurse": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
- "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
- "dev": true,
- "requires": {
- "estraverse": "^4.1.0"
- }
- },
- "estraverse": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
- "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
- "dev": true
- },
- "esutils": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
- "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
- "dev": true
- },
- "exec-sh": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.1.tgz",
- "integrity": "sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg==",
- "dev": true,
- "requires": {
- "merge": "^1.1.3"
- }
- },
- "execa": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
- "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
- "dev": true,
- "requires": {
- "cross-spawn": "^5.0.1",
- "get-stream": "^3.0.0",
- "is-stream": "^1.1.0",
- "npm-run-path": "^2.0.0",
- "p-finally": "^1.0.0",
- "signal-exit": "^3.0.0",
- "strip-eof": "^1.0.0"
- }
- },
- "exit": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
- "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
- "dev": true
- },
- "exit-hook": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz",
- "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=",
- "dev": true
- },
- "expand-brackets": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
- "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
- "dev": true,
- "requires": {
- "is-posix-bracket": "^0.1.0"
- }
- },
- "expand-range": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
- "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
- "dev": true,
- "requires": {
- "fill-range": "^2.1.0"
- }
- },
- "expect": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/expect/-/expect-22.4.3.tgz",
- "integrity": "sha512-XcNXEPehqn8b/jm8FYotdX0YrXn36qp4HWlrVT4ktwQas1l1LPxiVWncYnnL2eyMtKAmVIaG0XAp0QlrqJaxaA==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.0",
- "jest-diff": "^22.4.3",
- "jest-get-type": "^22.4.3",
- "jest-matcher-utils": "^22.4.3",
- "jest-message-util": "^22.4.3",
- "jest-regex-util": "^22.4.3"
- }
- },
- "extend": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
- "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
- "dev": true
- },
- "extend-shallow": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
- "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
- "dev": true,
- "requires": {
- "assign-symbols": "^1.0.0",
- "is-extendable": "^1.0.1"
- },
- "dependencies": {
- "is-extendable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
- "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
- "dev": true,
- "requires": {
- "is-plain-object": "^2.0.4"
- }
- }
- }
- },
- "external-editor": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
- "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==",
- "requires": {
- "chardet": "^0.4.0",
- "iconv-lite": "^0.4.17",
- "tmp": "^0.0.33"
- }
- },
- "extglob": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
- "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
- "dev": true,
- "requires": {
- "is-extglob": "^1.0.0"
- }
- },
- "extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
- "dev": true
- },
- "fast-deep-equal": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
- "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
- "dev": true
- },
- "fast-diff": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz",
- "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==",
- "dev": true
- },
- "fast-json-stable-stringify": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
- "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
- "dev": true
- },
- "fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
- "dev": true
- },
- "fb-watchman": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz",
- "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=",
- "dev": true,
- "requires": {
- "bser": "^2.0.0"
- }
- },
- "figures": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
- "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
- "requires": {
- "escape-string-regexp": "^1.0.5"
- }
- },
- "file-entry-cache": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
- "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
- "dev": true,
- "requires": {
- "flat-cache": "^1.2.1",
- "object-assign": "^4.0.1"
- }
- },
- "filename-regex": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
- "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
- "dev": true
- },
- "fileset": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz",
- "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=",
- "dev": true,
- "requires": {
- "glob": "^7.0.3",
- "minimatch": "^3.0.3"
- }
- },
- "fill-range": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz",
- "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
- "dev": true,
- "requires": {
- "is-number": "^2.1.0",
- "isobject": "^2.0.0",
- "randomatic": "^1.1.3",
- "repeat-element": "^1.1.2",
- "repeat-string": "^1.5.2"
- }
- },
- "find-parent-dir": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz",
- "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=",
- "dev": true
- },
- "find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
- "requires": {
- "locate-path": "^2.0.0"
- }
- },
- "first-chunk-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz",
- "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=",
- "requires": {
- "readable-stream": "^2.0.2"
- }
- },
- "flat-cache": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
- "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
- "dev": true,
- "requires": {
- "circular-json": "^0.3.1",
- "del": "^2.0.2",
- "graceful-fs": "^4.1.2",
- "write": "^0.2.1"
- }
- },
- "for-in": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
- "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
- "dev": true
- },
- "for-own": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
- "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
- "dev": true,
- "requires": {
- "for-in": "^1.0.1"
- }
- },
- "foreach": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
- "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=",
- "dev": true
- },
- "forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
- "dev": true
- },
- "form-data": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
- "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
- "dev": true,
- "requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "1.0.6",
- "mime-types": "^2.1.12"
- }
- },
- "formatio": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz",
- "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=",
- "dev": true,
- "requires": {
- "samsam": "1.x"
- }
- },
- "fragment-cache": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
- "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
- "dev": true,
- "requires": {
- "map-cache": "^0.2.2"
- }
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
- },
- "fsevents": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz",
- "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==",
- "dev": true,
- "optional": true,
- "requires": {
- "nan": "^2.3.0",
- "node-pre-gyp": "^0.6.39"
- },
- "dependencies": {
- "abbrev": {
- "version": "1.1.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "ajv": {
- "version": "4.11.8",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "co": "^4.6.0",
- "json-stable-stringify": "^1.0.1"
- }
- },
- "ansi-regex": {
- "version": "2.1.1",
- "bundled": true,
- "dev": true
- },
- "aproba": {
- "version": "1.1.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "are-we-there-yet": {
- "version": "1.1.4",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "delegates": "^1.0.0",
- "readable-stream": "^2.0.6"
- }
- },
- "asn1": {
- "version": "0.2.3",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "assert-plus": {
- "version": "0.2.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "asynckit": {
- "version": "0.4.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "aws-sign2": {
- "version": "0.6.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "aws4": {
- "version": "1.6.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "balanced-match": {
- "version": "0.4.2",
- "bundled": true,
- "dev": true
- },
- "bcrypt-pbkdf": {
- "version": "1.0.1",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "tweetnacl": "^0.14.3"
- }
- },
- "block-stream": {
- "version": "0.0.9",
- "bundled": true,
- "dev": true,
- "requires": {
- "inherits": "~2.0.0"
- }
- },
- "boom": {
- "version": "2.10.1",
- "bundled": true,
- "dev": true,
- "requires": {
- "hoek": "2.x.x"
- }
- },
- "brace-expansion": {
- "version": "1.1.7",
- "bundled": true,
- "dev": true,
- "requires": {
- "balanced-match": "^0.4.1",
- "concat-map": "0.0.1"
- }
- },
- "buffer-shims": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true
- },
- "caseless": {
- "version": "0.12.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "co": {
- "version": "4.6.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "code-point-at": {
- "version": "1.1.0",
- "bundled": true,
- "dev": true
- },
- "combined-stream": {
- "version": "1.0.5",
- "bundled": true,
- "dev": true,
- "requires": {
- "delayed-stream": "~1.0.0"
- }
- },
- "concat-map": {
- "version": "0.0.1",
- "bundled": true,
- "dev": true
- },
- "console-control-strings": {
- "version": "1.1.0",
- "bundled": true,
- "dev": true
- },
- "core-util-is": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true
- },
- "cryptiles": {
- "version": "2.0.5",
- "bundled": true,
- "dev": true,
- "requires": {
- "boom": "2.x.x"
- }
- },
- "dashdash": {
- "version": "1.14.1",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "assert-plus": "^1.0.0"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true,
- "optional": true
- }
- }
- },
- "debug": {
- "version": "2.6.8",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "deep-extend": {
- "version": "0.4.2",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "delayed-stream": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true
- },
- "delegates": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "detect-libc": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "ecc-jsbn": {
- "version": "0.1.1",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "jsbn": "~0.1.0"
- }
- },
- "extend": {
- "version": "3.0.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "extsprintf": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true
- },
- "forever-agent": {
- "version": "0.6.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "form-data": {
- "version": "2.1.4",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.5",
- "mime-types": "^2.1.12"
- }
- },
- "fs.realpath": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true
- },
- "fstream": {
- "version": "1.0.11",
- "bundled": true,
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "inherits": "~2.0.0",
- "mkdirp": ">=0.5 0",
- "rimraf": "2"
- }
- },
- "fstream-ignore": {
- "version": "1.0.5",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "fstream": "^1.0.0",
- "inherits": "2",
- "minimatch": "^3.0.0"
- }
- },
- "gauge": {
- "version": "2.7.4",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "aproba": "^1.0.3",
- "console-control-strings": "^1.0.0",
- "has-unicode": "^2.0.0",
- "object-assign": "^4.1.0",
- "signal-exit": "^3.0.0",
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1",
- "wide-align": "^1.1.0"
- }
- },
- "getpass": {
- "version": "0.1.7",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "assert-plus": "^1.0.0"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true,
- "optional": true
- }
- }
- },
- "glob": {
- "version": "7.1.2",
- "bundled": true,
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "graceful-fs": {
- "version": "4.1.11",
- "bundled": true,
- "dev": true
- },
- "har-schema": {
- "version": "1.0.5",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "har-validator": {
- "version": "4.2.1",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "ajv": "^4.9.1",
- "har-schema": "^1.0.5"
- }
- },
- "has-unicode": {
- "version": "2.0.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "hawk": {
- "version": "3.1.3",
- "bundled": true,
- "dev": true,
- "requires": {
- "boom": "2.x.x",
- "cryptiles": "2.x.x",
- "hoek": "2.x.x",
- "sntp": "1.x.x"
- }
- },
- "hoek": {
- "version": "2.16.3",
- "bundled": true,
- "dev": true
- },
- "http-signature": {
- "version": "1.1.1",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "assert-plus": "^0.2.0",
- "jsprim": "^1.2.2",
- "sshpk": "^1.7.0"
- }
- },
- "inflight": {
- "version": "1.0.6",
- "bundled": true,
- "dev": true,
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "bundled": true,
- "dev": true
- },
- "ini": {
- "version": "1.3.4",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "number-is-nan": "^1.0.0"
- }
- },
- "is-typedarray": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "isarray": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true
- },
- "isstream": {
- "version": "0.1.2",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "jodid25519": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "jsbn": "~0.1.0"
- }
- },
- "jsbn": {
- "version": "0.1.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "json-schema": {
- "version": "0.2.3",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "json-stable-stringify": {
- "version": "1.0.1",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "jsonify": "~0.0.0"
- }
- },
- "json-stringify-safe": {
- "version": "5.0.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "jsonify": {
- "version": "0.0.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "jsprim": {
- "version": "1.4.0",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.0.2",
- "json-schema": "0.2.3",
- "verror": "1.3.6"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true,
- "optional": true
- }
- }
- },
- "mime-db": {
- "version": "1.27.0",
- "bundled": true,
- "dev": true
- },
- "mime-types": {
- "version": "2.1.15",
- "bundled": true,
- "dev": true,
- "requires": {
- "mime-db": "~1.27.0"
- }
- },
- "minimatch": {
- "version": "3.0.4",
- "bundled": true,
- "dev": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "minimist": {
- "version": "0.0.8",
- "bundled": true,
- "dev": true
- },
- "mkdirp": {
- "version": "0.5.1",
- "bundled": true,
- "dev": true,
- "requires": {
- "minimist": "0.0.8"
- }
- },
- "ms": {
- "version": "2.0.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "node-pre-gyp": {
- "version": "0.6.39",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "detect-libc": "^1.0.2",
- "hawk": "3.1.3",
- "mkdirp": "^0.5.1",
- "nopt": "^4.0.1",
- "npmlog": "^4.0.2",
- "rc": "^1.1.7",
- "request": "2.81.0",
- "rimraf": "^2.6.1",
- "semver": "^5.3.0",
- "tar": "^2.2.1",
- "tar-pack": "^3.4.0"
- }
- },
- "nopt": {
- "version": "4.0.1",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "abbrev": "1",
- "osenv": "^0.1.4"
- }
- },
- "npmlog": {
- "version": "4.1.0",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "are-we-there-yet": "~1.1.2",
- "console-control-strings": "~1.1.0",
- "gauge": "~2.7.3",
- "set-blocking": "~2.0.0"
- }
- },
- "number-is-nan": {
- "version": "1.0.1",
- "bundled": true,
- "dev": true
- },
- "oauth-sign": {
- "version": "0.8.2",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "object-assign": {
- "version": "4.1.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "once": {
- "version": "1.4.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "wrappy": "1"
- }
- },
- "os-homedir": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "os-tmpdir": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "osenv": {
- "version": "0.1.4",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "os-homedir": "^1.0.0",
- "os-tmpdir": "^1.0.0"
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "bundled": true,
- "dev": true
- },
- "performance-now": {
- "version": "0.2.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "process-nextick-args": {
- "version": "1.0.7",
- "bundled": true,
- "dev": true
- },
- "punycode": {
- "version": "1.4.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "qs": {
- "version": "6.4.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "rc": {
- "version": "1.2.1",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "deep-extend": "~0.4.0",
- "ini": "~1.3.0",
- "minimist": "^1.2.0",
- "strip-json-comments": "~2.0.1"
- },
- "dependencies": {
- "minimist": {
- "version": "1.2.0",
- "bundled": true,
- "dev": true,
- "optional": true
- }
- }
- },
- "readable-stream": {
- "version": "2.2.9",
- "bundled": true,
- "dev": true,
- "requires": {
- "buffer-shims": "~1.0.0",
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "~1.0.0",
- "process-nextick-args": "~1.0.6",
- "string_decoder": "~1.0.0",
- "util-deprecate": "~1.0.1"
- }
- },
- "request": {
- "version": "2.81.0",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "aws-sign2": "~0.6.0",
- "aws4": "^1.2.1",
- "caseless": "~0.12.0",
- "combined-stream": "~1.0.5",
- "extend": "~3.0.0",
- "forever-agent": "~0.6.1",
- "form-data": "~2.1.1",
- "har-validator": "~4.2.1",
- "hawk": "~3.1.3",
- "http-signature": "~1.1.0",
- "is-typedarray": "~1.0.0",
- "isstream": "~0.1.2",
- "json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.7",
- "oauth-sign": "~0.8.1",
- "performance-now": "^0.2.0",
- "qs": "~6.4.0",
- "safe-buffer": "^5.0.1",
- "stringstream": "~0.0.4",
- "tough-cookie": "~2.3.0",
- "tunnel-agent": "^0.6.0",
- "uuid": "^3.0.0"
- }
- },
- "rimraf": {
- "version": "2.6.1",
- "bundled": true,
- "dev": true,
- "requires": {
- "glob": "^7.0.5"
- }
- },
- "safe-buffer": {
- "version": "5.0.1",
- "bundled": true,
- "dev": true
- },
- "semver": {
- "version": "5.3.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "set-blocking": {
- "version": "2.0.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "signal-exit": {
- "version": "3.0.2",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "sntp": {
- "version": "1.0.9",
- "bundled": true,
- "dev": true,
- "requires": {
- "hoek": "2.x.x"
- }
- },
- "sshpk": {
- "version": "1.13.0",
- "bundled": true,
- "dev": true,
- "optional": true,
- "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",
- "jodid25519": "^1.0.0",
- "jsbn": "~0.1.0",
- "tweetnacl": "~0.14.0"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true,
- "optional": true
- }
- }
- },
- "string-width": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true,
- "requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- }
- },
- "string_decoder": {
- "version": "1.0.1",
- "bundled": true,
- "dev": true,
- "requires": {
- "safe-buffer": "^5.0.1"
- }
- },
- "stringstream": {
- "version": "0.0.5",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "strip-ansi": {
- "version": "3.0.1",
- "bundled": true,
- "dev": true,
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "strip-json-comments": {
- "version": "2.0.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "tar": {
- "version": "2.2.1",
- "bundled": true,
- "dev": true,
- "requires": {
- "block-stream": "*",
- "fstream": "^1.0.2",
- "inherits": "2"
- }
- },
- "tar-pack": {
- "version": "3.4.0",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "debug": "^2.2.0",
- "fstream": "^1.0.10",
- "fstream-ignore": "^1.0.5",
- "once": "^1.3.3",
- "readable-stream": "^2.1.4",
- "rimraf": "^2.5.1",
- "tar": "^2.2.1",
- "uid-number": "^0.0.6"
- }
- },
- "tough-cookie": {
- "version": "2.3.2",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "punycode": "^1.4.1"
- }
- },
- "tunnel-agent": {
- "version": "0.6.0",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "safe-buffer": "^5.0.1"
- }
- },
- "tweetnacl": {
- "version": "0.14.5",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "uid-number": {
- "version": "0.0.6",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "util-deprecate": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true
- },
- "uuid": {
- "version": "3.0.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "verror": {
- "version": "1.3.6",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "extsprintf": "1.0.2"
- }
- },
- "wide-align": {
- "version": "1.1.2",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "string-width": "^1.0.2"
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true
- }
- }
- },
- "function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
- },
- "functional-red-black-tree": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
- "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
- "dev": true
- },
- "get-caller-file": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
- "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=",
- "dev": true
- },
- "get-own-enumerable-property-symbols": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-2.0.1.tgz",
- "integrity": "sha512-TtY/sbOemiMKPRUDDanGCSgBYe7Mf0vbRsWnBZ+9yghpZ1MvcpSpuZFjHdEeY/LZjZy0vdLjS77L6HosisFiug==",
- "dev": true
- },
- "get-stdin": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
- "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4="
- },
- "get-stream": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
- "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
- },
- "get-value": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
- "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=",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0"
- }
- },
- "gh-got": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/gh-got/-/gh-got-6.0.0.tgz",
- "integrity": "sha512-F/mS+fsWQMo1zfgG9MD8KWvTWPPzzhuVwY++fhQ5Ggd+0P+CAMHtzMZhNxG+TqGfHDChJKsbh6otfMGqO2AKBw==",
- "requires": {
- "got": "^7.0.0",
- "is-plain-obj": "^1.1.0"
- }
- },
- "github-username": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/github-username/-/github-username-4.1.0.tgz",
- "integrity": "sha1-y+KABBiDIG2kISrp5LXxacML9Bc=",
- "requires": {
- "gh-got": "^6.0.0"
- }
- },
- "glob": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
- "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "glob-base": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
- "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
- "dev": true,
- "requires": {
- "glob-parent": "^2.0.0",
- "is-glob": "^2.0.0"
- }
- },
- "glob-parent": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
- "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
- "dev": true,
- "requires": {
- "is-glob": "^2.0.0"
- }
- },
- "globals": {
- "version": "11.4.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.4.0.tgz",
- "integrity": "sha512-Dyzmifil8n/TmSqYDEXbm+C8yitzJQqQIlJQLNRMwa+BOUJpRC19pyVeN12JAjt61xonvXjtff+hJruTRXn5HA==",
- "dev": true
- },
- "globby": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
- "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
- "requires": {
- "array-union": "^1.0.1",
- "glob": "^7.0.3",
- "object-assign": "^4.0.1",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- },
- "dependencies": {
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
- }
- }
- },
- "got": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz",
- "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==",
- "requires": {
- "decompress-response": "^3.2.0",
- "duplexer3": "^0.1.4",
- "get-stream": "^3.0.0",
- "is-plain-obj": "^1.1.0",
- "is-retry-allowed": "^1.0.0",
- "is-stream": "^1.0.0",
- "isurl": "^1.0.0-alpha5",
- "lowercase-keys": "^1.0.0",
- "p-cancelable": "^0.3.0",
- "p-timeout": "^1.1.1",
- "safe-buffer": "^5.0.1",
- "timed-out": "^4.0.0",
- "url-parse-lax": "^1.0.0",
- "url-to-options": "^1.0.1"
- }
- },
- "graceful-fs": {
- "version": "4.1.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
- "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
- },
- "grouped-queue": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/grouped-queue/-/grouped-queue-0.3.3.tgz",
- "integrity": "sha1-wWfSpTGcWg4JZO9qJbfC34mWyFw=",
- "requires": {
- "lodash": "^4.17.2"
- }
- },
- "growly": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
- "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=",
- "dev": true
- },
- "handlebars": {
- "version": "4.0.11",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz",
- "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=",
- "dev": true,
- "requires": {
- "async": "^1.4.0",
- "optimist": "^0.6.1",
- "source-map": "^0.4.4",
- "uglify-js": "^2.6"
- },
- "dependencies": {
- "async": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
- "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
- "dev": true
- },
- "source-map": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
- "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
- "dev": true,
- "requires": {
- "amdefine": ">=0.0.4"
- }
- }
- }
- },
- "har-schema": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
- "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
- "dev": true
- },
- "har-validator": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
- "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
- "dev": true,
- "requires": {
- "ajv": "^5.1.0",
- "har-schema": "^2.0.0"
- }
- },
- "has": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz",
- "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=",
- "dev": true,
- "requires": {
- "function-bind": "^1.0.2"
- }
- },
- "has-ansi": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
- "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
- "requires": {
- "ansi-regex": "^2.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
- }
- }
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
- },
- "has-symbol-support-x": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz",
- "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw=="
- },
- "has-to-string-tag-x": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz",
- "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==",
- "requires": {
- "has-symbol-support-x": "^1.4.1"
- }
- },
- "has-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
- "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
- "dev": true,
- "requires": {
- "get-value": "^2.0.6",
- "has-values": "^1.0.0",
- "isobject": "^3.0.0"
- },
- "dependencies": {
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- }
- }
- },
- "has-values": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
- "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
- "dev": true,
- "requires": {
- "is-number": "^3.0.0",
- "kind-of": "^4.0.0"
- },
- "dependencies": {
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "kind-of": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
- "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "hawk": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz",
- "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==",
- "dev": true,
- "requires": {
- "boom": "4.x.x",
- "cryptiles": "3.x.x",
- "hoek": "4.x.x",
- "sntp": "2.x.x"
- }
- },
- "hoek": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz",
- "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==",
- "dev": true
- },
- "home-or-tmp": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
- "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
- "dev": true,
- "requires": {
- "os-homedir": "^1.0.0",
- "os-tmpdir": "^1.0.1"
- }
- },
- "hosted-git-info": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz",
- "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw=="
- },
- "html-encoding-sniffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz",
- "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==",
- "dev": true,
- "requires": {
- "whatwg-encoding": "^1.0.1"
- }
- },
- "http-signature": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
- "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0",
- "jsprim": "^1.2.2",
- "sshpk": "^1.7.0"
- }
- },
- "husky": {
- "version": "0.14.3",
- "resolved": "https://registry.npmjs.org/husky/-/husky-0.14.3.tgz",
- "integrity": "sha512-e21wivqHpstpoiWA/Yi8eFti8E+sQDSS53cpJsPptPs295QTOQR0ZwnHo2TXy1XOpZFD9rPOd3NpmqTK6uMLJA==",
- "dev": true,
- "requires": {
- "is-ci": "^1.0.10",
- "normalize-path": "^1.0.0",
- "strip-indent": "^2.0.0"
- }
- },
- "iconv-lite": {
- "version": "0.4.21",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz",
- "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==",
- "requires": {
- "safer-buffer": "^2.1.0"
- }
- },
- "ignore": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz",
- "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==",
- "dev": true
- },
- "import-local": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz",
- "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==",
- "dev": true,
- "requires": {
- "pkg-dir": "^2.0.0",
- "resolve-cwd": "^2.0.0"
- }
- },
- "imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
- "dev": true
- },
- "indent-string": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
- "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
- "dev": true,
- "requires": {
- "repeating": "^2.0.0"
- }
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "inquirer": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
- "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
- "requires": {
- "ansi-escapes": "^3.0.0",
- "chalk": "^2.0.0",
- "cli-cursor": "^2.1.0",
- "cli-width": "^2.0.0",
- "external-editor": "^2.0.4",
- "figures": "^2.0.0",
- "lodash": "^4.3.0",
- "mute-stream": "0.0.7",
- "run-async": "^2.2.0",
- "rx-lite": "^4.0.8",
- "rx-lite-aggregates": "^4.0.8",
- "string-width": "^2.1.0",
- "strip-ansi": "^4.0.0",
- "through": "^2.3.6"
- }
- },
- "interpret": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
- "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ="
- },
- "invariant": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
- "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
- "dev": true,
- "requires": {
- "loose-envify": "^1.0.0"
- }
- },
- "invert-kv": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
- "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
- "dev": true
- },
- "is-accessor-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
- "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- }
- },
- "is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
- },
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
- "is-builtin-module": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
- "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
- "requires": {
- "builtin-modules": "^1.0.0"
- }
- },
- "is-callable": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz",
- "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=",
- "dev": true
- },
- "is-ci": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz",
- "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==",
- "dev": true,
- "requires": {
- "ci-info": "^1.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
- "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- }
- },
- "is-date-object": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
- "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
- "dev": true
- },
- "is-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
- "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^0.1.6",
- "is-data-descriptor": "^0.1.4",
- "kind-of": "^5.0.0"
- },
- "dependencies": {
- "kind-of": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
- "dev": true
- }
- }
- },
- "is-directory": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
- "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=",
- "dev": true
- },
- "is-dotfile": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
- "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
- "dev": true
- },
- "is-equal-shallow": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
- "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
- "dev": true,
- "requires": {
- "is-primitive": "^2.0.0"
- }
- },
- "is-extendable": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
- "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
- "dev": true
- },
- "is-extglob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
- "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
- "dev": true
- },
- "is-finite": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
- "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
- "dev": true,
- "requires": {
- "number-is-nan": "^1.0.0"
- }
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
- },
- "is-generator-fn": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz",
- "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=",
- "dev": true
- },
- "is-glob": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
- "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
- "dev": true,
- "requires": {
- "is-extglob": "^1.0.0"
- }
- },
- "is-number": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
- "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- }
- },
- "is-obj": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
- "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
- "dev": true
- },
- "is-object": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz",
- "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA="
- },
- "is-observable": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-0.2.0.tgz",
- "integrity": "sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI=",
- "dev": true,
- "requires": {
- "symbol-observable": "^0.2.2"
- }
- },
- "is-odd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
- "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
- "dev": true,
- "requires": {
- "is-number": "^4.0.0"
- },
- "dependencies": {
- "is-number": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
- "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
- "dev": true
- }
- }
- },
- "is-path-cwd": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
- "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
- "dev": true
- },
- "is-path-in-cwd": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
- "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
- "dev": true,
- "requires": {
- "is-path-inside": "^1.0.0"
- }
- },
- "is-path-inside": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
- "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
- "dev": true,
- "requires": {
- "path-is-inside": "^1.0.1"
- }
- },
- "is-plain-obj": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
- "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
- },
- "is-plain-object": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
- "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
- "dev": true,
- "requires": {
- "isobject": "^3.0.1"
- },
- "dependencies": {
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- }
- }
- },
- "is-posix-bracket": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
- "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
- "dev": true
- },
- "is-primitive": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
- "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
- "dev": true
- },
- "is-promise": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
- "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
- },
- "is-redirect": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
- "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=",
- "dev": true
- },
- "is-regex": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
- "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
- "dev": true,
- "requires": {
- "has": "^1.0.1"
- }
- },
- "is-regexp": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
- "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=",
- "dev": true
- },
- "is-resolvable": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
- "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
- "dev": true
- },
- "is-retry-allowed": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz",
- "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ="
- },
- "is-scoped": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-scoped/-/is-scoped-1.0.0.tgz",
- "integrity": "sha1-RJypgpnnEwOCViieyytUDcQ3yzA=",
- "requires": {
- "scoped-regex": "^1.0.0"
- }
- },
- "is-stream": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
- },
- "is-symbol": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz",
- "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=",
- "dev": true
- },
- "is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
- "dev": true
- },
- "is-utf8": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
- "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI="
- },
- "is-windows": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
- "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
- "dev": true
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
- },
- "isobject": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
- "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
- "dev": true,
- "requires": {
- "isarray": "1.0.0"
- }
- },
- "isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
- "dev": true
- },
- "istanbul-api": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.1.tgz",
- "integrity": "sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g==",
- "dev": true,
- "requires": {
- "async": "^2.1.4",
- "compare-versions": "^3.1.0",
- "fileset": "^2.0.2",
- "istanbul-lib-coverage": "^1.2.0",
- "istanbul-lib-hook": "^1.2.0",
- "istanbul-lib-instrument": "^1.10.1",
- "istanbul-lib-report": "^1.1.4",
- "istanbul-lib-source-maps": "^1.2.4",
- "istanbul-reports": "^1.3.0",
- "js-yaml": "^3.7.0",
- "mkdirp": "^0.5.1",
- "once": "^1.4.0"
- },
- "dependencies": {
- "istanbul-lib-source-maps": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz",
- "integrity": "sha512-UzuK0g1wyQijiaYQxj/CdNycFhAd2TLtO2obKQMTZrZ1jzEMRY3rvpASEKkaxbRR6brvdovfA03znPa/pXcejg==",
- "dev": true,
- "requires": {
- "debug": "^3.1.0",
- "istanbul-lib-coverage": "^1.2.0",
- "mkdirp": "^0.5.1",
- "rimraf": "^2.6.1",
- "source-map": "^0.5.3"
- }
- }
- }
- },
- "istanbul-lib-coverage": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz",
- "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==",
- "dev": true
- },
- "istanbul-lib-hook": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.0.tgz",
- "integrity": "sha512-p3En6/oGkFQV55Up8ZPC2oLxvgSxD8CzA0yBrhRZSh3pfv3OFj9aSGVC0yoerAi/O4u7jUVnOGVX1eVFM+0tmQ==",
- "dev": true,
- "requires": {
- "append-transform": "^0.4.0"
- }
- },
- "istanbul-lib-instrument": {
- "version": "1.10.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz",
- "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==",
- "dev": true,
- "requires": {
- "babel-generator": "^6.18.0",
- "babel-template": "^6.16.0",
- "babel-traverse": "^6.18.0",
- "babel-types": "^6.18.0",
- "babylon": "^6.18.0",
- "istanbul-lib-coverage": "^1.2.0",
- "semver": "^5.3.0"
- }
- },
- "istanbul-lib-report": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz",
- "integrity": "sha512-Azqvq5tT0U09nrncK3q82e/Zjkxa4tkFZv7E6VcqP0QCPn6oNljDPfrZEC/umNXds2t7b8sRJfs6Kmpzt8m2kA==",
- "dev": true,
- "requires": {
- "istanbul-lib-coverage": "^1.2.0",
- "mkdirp": "^0.5.1",
- "path-parse": "^1.0.5",
- "supports-color": "^3.1.2"
- },
- "dependencies": {
- "has-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
- "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
- "dev": true
- },
- "supports-color": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
- "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
- "dev": true,
- "requires": {
- "has-flag": "^1.0.0"
- }
- }
- }
- },
- "istanbul-lib-source-maps": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz",
- "integrity": "sha512-fDa0hwU/5sDXwAklXgAoCJCOsFsBplVQ6WBldz5UwaqOzmDhUK4nfuR7/G//G2lERlblUNJB8P6e8cXq3a7MlA==",
- "dev": true,
- "requires": {
- "debug": "^3.1.0",
- "istanbul-lib-coverage": "^1.1.2",
- "mkdirp": "^0.5.1",
- "rimraf": "^2.6.1",
- "source-map": "^0.5.3"
- }
- },
- "istanbul-reports": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.3.0.tgz",
- "integrity": "sha512-y2Z2IMqE1gefWUaVjrBm0mSKvUkaBy9Vqz8iwr/r40Y9hBbIteH5wqHG/9DLTfJ9xUnUT2j7A3+VVJ6EaYBllA==",
- "dev": true,
- "requires": {
- "handlebars": "^4.0.3"
- }
- },
- "istextorbinary": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.2.1.tgz",
- "integrity": "sha512-TS+hoFl8Z5FAFMK38nhBkdLt44CclNRgDHWeMgsV8ko3nDlr/9UI2Sf839sW7enijf8oKsZYXRvM8g0it9Zmcw==",
- "requires": {
- "binaryextensions": "2",
- "editions": "^1.3.3",
- "textextensions": "2"
- }
- },
- "isurl": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz",
- "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==",
- "requires": {
- "has-to-string-tag-x": "^1.2.0",
- "is-object": "^1.0.1"
- }
- },
- "jest": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest/-/jest-22.4.3.tgz",
- "integrity": "sha512-FFCdU/pXOEASfHxFDOWUysI/+FFoqiXJADEIXgDKuZyqSmBD3tZ4BEGH7+M79v7czj7bbkhwtd2LaEDcJiM/GQ==",
- "dev": true,
- "requires": {
- "import-local": "^1.0.0",
- "jest-cli": "^22.4.3"
- },
- "dependencies": {
- "jest-cli": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-22.4.3.tgz",
- "integrity": "sha512-IiHybF0DJNqZPsbjn4Cy4vcqcmImpoFwNFnkehzVw8lTUSl4axZh5DHewu5bdpZF2Y5gUqFKYzH0FH4Qx2k+UA==",
- "dev": true,
- "requires": {
- "ansi-escapes": "^3.0.0",
- "chalk": "^2.0.1",
- "exit": "^0.1.2",
- "glob": "^7.1.2",
- "graceful-fs": "^4.1.11",
- "import-local": "^1.0.0",
- "is-ci": "^1.0.10",
- "istanbul-api": "^1.1.14",
- "istanbul-lib-coverage": "^1.1.1",
- "istanbul-lib-instrument": "^1.8.0",
- "istanbul-lib-source-maps": "^1.2.1",
- "jest-changed-files": "^22.4.3",
- "jest-config": "^22.4.3",
- "jest-environment-jsdom": "^22.4.3",
- "jest-get-type": "^22.4.3",
- "jest-haste-map": "^22.4.3",
- "jest-message-util": "^22.4.3",
- "jest-regex-util": "^22.4.3",
- "jest-resolve-dependencies": "^22.4.3",
- "jest-runner": "^22.4.3",
- "jest-runtime": "^22.4.3",
- "jest-snapshot": "^22.4.3",
- "jest-util": "^22.4.3",
- "jest-validate": "^22.4.3",
- "jest-worker": "^22.4.3",
- "micromatch": "^2.3.11",
- "node-notifier": "^5.2.1",
- "realpath-native": "^1.0.0",
- "rimraf": "^2.5.4",
- "slash": "^1.0.0",
- "string-length": "^2.0.0",
- "strip-ansi": "^4.0.0",
- "which": "^1.2.12",
- "yargs": "^10.0.3"
- }
- }
- }
- },
- "jest-changed-files": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-22.4.3.tgz",
- "integrity": "sha512-83Dh0w1aSkUNFhy5d2dvqWxi/y6weDwVVLU6vmK0cV9VpRxPzhTeGimbsbRDSnEoszhF937M4sDLLeS7Cu/Tmw==",
- "dev": true,
- "requires": {
- "throat": "^4.0.0"
- }
- },
- "jest-config": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-22.4.3.tgz",
- "integrity": "sha512-KSg3EOToCgkX+lIvenKY7J8s426h6ahXxaUFJxvGoEk0562Z6inWj1TnKoGycTASwiLD+6kSYFALcjdosq9KIQ==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.1",
- "glob": "^7.1.1",
- "jest-environment-jsdom": "^22.4.3",
- "jest-environment-node": "^22.4.3",
- "jest-get-type": "^22.4.3",
- "jest-jasmine2": "^22.4.3",
- "jest-regex-util": "^22.4.3",
- "jest-resolve": "^22.4.3",
- "jest-util": "^22.4.3",
- "jest-validate": "^22.4.3",
- "pretty-format": "^22.4.3"
- }
- },
- "jest-diff": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-22.4.3.tgz",
- "integrity": "sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.1",
- "diff": "^3.2.0",
- "jest-get-type": "^22.4.3",
- "pretty-format": "^22.4.3"
- }
- },
- "jest-docblock": {
- "version": "21.2.0",
- "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz",
- "integrity": "sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw==",
- "dev": true
- },
- "jest-environment-jsdom": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz",
- "integrity": "sha512-FviwfR+VyT3Datf13+ULjIMO5CSeajlayhhYQwpzgunswoaLIPutdbrnfUHEMyJCwvqQFaVtTmn9+Y8WCt6n1w==",
- "dev": true,
- "requires": {
- "jest-mock": "^22.4.3",
- "jest-util": "^22.4.3",
- "jsdom": "^11.5.1"
- }
- },
- "jest-environment-node": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-22.4.3.tgz",
- "integrity": "sha512-reZl8XF6t/lMEuPWwo9OLfttyC26A5AMgDyEQ6DBgZuyfyeNUzYT8BFo6uxCCP/Av/b7eb9fTi3sIHFPBzmlRA==",
- "dev": true,
- "requires": {
- "jest-mock": "^22.4.3",
- "jest-util": "^22.4.3"
- }
- },
- "jest-get-type": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz",
- "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==",
- "dev": true
- },
- "jest-haste-map": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-22.4.3.tgz",
- "integrity": "sha512-4Q9fjzuPVwnaqGKDpIsCSoTSnG3cteyk2oNVjBX12HHOaF1oxql+uUiqZb5Ndu7g/vTZfdNwwy4WwYogLh29DQ==",
- "dev": true,
- "requires": {
- "fb-watchman": "^2.0.0",
- "graceful-fs": "^4.1.11",
- "jest-docblock": "^22.4.3",
- "jest-serializer": "^22.4.3",
- "jest-worker": "^22.4.3",
- "micromatch": "^2.3.11",
- "sane": "^2.0.0"
- },
- "dependencies": {
- "jest-docblock": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-22.4.3.tgz",
- "integrity": "sha512-uPKBEAw7YrEMcXueMKZXn/rbMxBiSv48fSqy3uEnmgOlQhSX+lthBqHb1fKWNVmFqAp9E/RsSdBfiV31LbzaOg==",
- "dev": true,
- "requires": {
- "detect-newline": "^2.1.0"
- }
- }
- }
- },
- "jest-jasmine2": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-22.4.3.tgz",
- "integrity": "sha512-yZCPCJUcEY6R5KJB/VReo1AYI2b+5Ky+C+JA1v34jndJsRcLpU4IZX4rFJn7yDTtdNbO/nNqg+3SDIPNH2ecnw==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.1",
- "co": "^4.6.0",
- "expect": "^22.4.3",
- "graceful-fs": "^4.1.11",
- "is-generator-fn": "^1.0.0",
- "jest-diff": "^22.4.3",
- "jest-matcher-utils": "^22.4.3",
- "jest-message-util": "^22.4.3",
- "jest-snapshot": "^22.4.3",
- "jest-util": "^22.4.3",
- "source-map-support": "^0.5.0"
- }
- },
- "jest-leak-detector": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-22.4.3.tgz",
- "integrity": "sha512-NZpR/Ls7+ndO57LuXROdgCGz2RmUdC541tTImL9bdUtU3WadgFGm0yV+Ok4Fuia/1rLAn5KaJ+i76L6e3zGJYQ==",
- "dev": true,
- "requires": {
- "pretty-format": "^22.4.3"
- }
- },
- "jest-matcher-utils": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz",
- "integrity": "sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.1",
- "jest-get-type": "^22.4.3",
- "pretty-format": "^22.4.3"
- }
- },
- "jest-message-util": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-22.4.3.tgz",
- "integrity": "sha512-iAMeKxhB3Se5xkSjU0NndLLCHtP4n+GtCqV0bISKA5dmOXQfEbdEmYiu2qpnWBDCQdEafNDDU6Q+l6oBMd/+BA==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.0.0-beta.35",
- "chalk": "^2.0.1",
- "micromatch": "^2.3.11",
- "slash": "^1.0.0",
- "stack-utils": "^1.0.1"
- }
- },
- "jest-mock": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-22.4.3.tgz",
- "integrity": "sha512-+4R6mH5M1G4NK16CKg9N1DtCaFmuxhcIqF4lQK/Q1CIotqMs/XBemfpDPeVZBFow6iyUNu6EBT9ugdNOTT5o5Q==",
- "dev": true
- },
- "jest-regex-util": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-22.4.3.tgz",
- "integrity": "sha512-LFg1gWr3QinIjb8j833bq7jtQopiwdAs67OGfkPrvy7uNUbVMfTXXcOKXJaeY5GgjobELkKvKENqq1xrUectWg==",
- "dev": true
- },
- "jest-resolve": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-22.4.3.tgz",
- "integrity": "sha512-u3BkD/MQBmwrOJDzDIaxpyqTxYH+XqAXzVJP51gt29H8jpj3QgKof5GGO2uPGKGeA1yTMlpbMs1gIQ6U4vcRhw==",
- "dev": true,
- "requires": {
- "browser-resolve": "^1.11.2",
- "chalk": "^2.0.1"
- }
- },
- "jest-resolve-dependencies": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-22.4.3.tgz",
- "integrity": "sha512-06czCMVToSN8F2U4EvgSB1Bv/56gc7MpCftZ9z9fBgUQM7dzHGCMBsyfVA6dZTx8v0FDcnALf7hupeQxaBCvpA==",
- "dev": true,
- "requires": {
- "jest-regex-util": "^22.4.3"
- }
- },
- "jest-runner": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-22.4.3.tgz",
- "integrity": "sha512-U7PLlQPRlWNbvOHWOrrVay9sqhBJmiKeAdKIkvX4n1G2tsvzLlf77nBD28GL1N6tGv4RmuTfI8R8JrkvCa+IBg==",
- "dev": true,
- "requires": {
- "exit": "^0.1.2",
- "jest-config": "^22.4.3",
- "jest-docblock": "^22.4.3",
- "jest-haste-map": "^22.4.3",
- "jest-jasmine2": "^22.4.3",
- "jest-leak-detector": "^22.4.3",
- "jest-message-util": "^22.4.3",
- "jest-runtime": "^22.4.3",
- "jest-util": "^22.4.3",
- "jest-worker": "^22.4.3",
- "throat": "^4.0.0"
- },
- "dependencies": {
- "jest-docblock": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-22.4.3.tgz",
- "integrity": "sha512-uPKBEAw7YrEMcXueMKZXn/rbMxBiSv48fSqy3uEnmgOlQhSX+lthBqHb1fKWNVmFqAp9E/RsSdBfiV31LbzaOg==",
- "dev": true,
- "requires": {
- "detect-newline": "^2.1.0"
- }
- }
- }
- },
- "jest-runtime": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-22.4.3.tgz",
- "integrity": "sha512-Eat/esQjevhx9BgJEC8udye+FfoJ2qvxAZfOAWshYGS22HydHn5BgsvPdTtt9cp0fSl5LxYOFA1Pja9Iz2Zt8g==",
- "dev": true,
- "requires": {
- "babel-core": "^6.0.0",
- "babel-jest": "^22.4.3",
- "babel-plugin-istanbul": "^4.1.5",
- "chalk": "^2.0.1",
- "convert-source-map": "^1.4.0",
- "exit": "^0.1.2",
- "graceful-fs": "^4.1.11",
- "jest-config": "^22.4.3",
- "jest-haste-map": "^22.4.3",
- "jest-regex-util": "^22.4.3",
- "jest-resolve": "^22.4.3",
- "jest-util": "^22.4.3",
- "jest-validate": "^22.4.3",
- "json-stable-stringify": "^1.0.1",
- "micromatch": "^2.3.11",
- "realpath-native": "^1.0.0",
- "slash": "^1.0.0",
- "strip-bom": "3.0.0",
- "write-file-atomic": "^2.1.0",
- "yargs": "^10.0.3"
- }
- },
- "jest-serializer": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-22.4.3.tgz",
- "integrity": "sha512-uPaUAppx4VUfJ0QDerpNdF43F68eqKWCzzhUlKNDsUPhjOon7ZehR4C809GCqh765FoMRtTVUVnGvIoskkYHiw==",
- "dev": true
- },
- "jest-snapshot": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-22.4.3.tgz",
- "integrity": "sha512-JXA0gVs5YL0HtLDCGa9YxcmmV2LZbwJ+0MfyXBBc5qpgkEYITQFJP7XNhcHFbUvRiniRpRbGVfJrOoYhhGE0RQ==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.1",
- "jest-diff": "^22.4.3",
- "jest-matcher-utils": "^22.4.3",
- "mkdirp": "^0.5.1",
- "natural-compare": "^1.4.0",
- "pretty-format": "^22.4.3"
- }
- },
- "jest-util": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-22.4.3.tgz",
- "integrity": "sha512-rfDfG8wyC5pDPNdcnAlZgwKnzHvZDu8Td2NJI/jAGKEGxJPYiE4F0ss/gSAkG4778Y23Hvbz+0GMrDJTeo7RjQ==",
- "dev": true,
- "requires": {
- "callsites": "^2.0.0",
- "chalk": "^2.0.1",
- "graceful-fs": "^4.1.11",
- "is-ci": "^1.0.10",
- "jest-message-util": "^22.4.3",
- "mkdirp": "^0.5.1",
- "source-map": "^0.6.0"
- },
- "dependencies": {
- "callsites": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
- "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=",
- "dev": true
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- }
- }
- },
- "jest-validate": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-22.4.3.tgz",
- "integrity": "sha512-CfFM18W3GSP/xgmA4UouIx0ljdtfD2mjeBC6c89Gg17E44D4tQhAcTrZmf9djvipwU30kSTnk6CzcxdCCeSXfA==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.1",
- "jest-config": "^22.4.3",
- "jest-get-type": "^22.4.3",
- "leven": "^2.1.0",
- "pretty-format": "^22.4.3"
- }
- },
- "jest-worker": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-22.4.3.tgz",
- "integrity": "sha512-B1ucW4fI8qVAuZmicFxI1R3kr2fNeYJyvIQ1rKcuLYnenFV5K5aMbxFj6J0i00Ju83S8jP2d7Dz14+AvbIHRYQ==",
- "dev": true,
- "requires": {
- "merge-stream": "^1.0.1"
- }
- },
- "js-tokens": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
- "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
- "dev": true
- },
- "js-yaml": {
- "version": "3.11.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz",
- "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==",
- "dev": true,
- "requires": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- }
- },
- "jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
- "dev": true,
- "optional": true
- },
- "jsdom": {
- "version": "11.8.0",
- "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.8.0.tgz",
- "integrity": "sha512-fZZSH6P8tVqYIQl0WKpZuQljPu2cW41Uj/c9omtyGwjwZCB8c82UAi7BSQs/F1FgWovmZsoU02z3k28eHp0Cdw==",
- "dev": true,
- "requires": {
- "abab": "^1.0.4",
- "acorn": "^5.3.0",
- "acorn-globals": "^4.1.0",
- "array-equal": "^1.0.0",
- "cssom": ">= 0.3.2 < 0.4.0",
- "cssstyle": ">= 0.2.37 < 0.3.0",
- "data-urls": "^1.0.0",
- "domexception": "^1.0.0",
- "escodegen": "^1.9.0",
- "html-encoding-sniffer": "^1.0.2",
- "left-pad": "^1.2.0",
- "nwmatcher": "^1.4.3",
- "parse5": "4.0.0",
- "pn": "^1.1.0",
- "request": "^2.83.0",
- "request-promise-native": "^1.0.5",
- "sax": "^1.2.4",
- "symbol-tree": "^3.2.2",
- "tough-cookie": "^2.3.3",
- "w3c-hr-time": "^1.0.1",
- "webidl-conversions": "^4.0.2",
- "whatwg-encoding": "^1.0.3",
- "whatwg-mimetype": "^2.1.0",
- "whatwg-url": "^6.4.0",
- "ws": "^4.0.0",
- "xml-name-validator": "^3.0.0"
- }
- },
- "jsesc": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
- "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
- "dev": true
- },
- "json-parse-better-errors": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
- "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="
- },
- "json-schema": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
- "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
- "dev": true
- },
- "json-schema-traverse": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
- "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
- "dev": true
- },
- "json-stable-stringify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
- "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
- "dev": true,
- "requires": {
- "jsonify": "~0.0.0"
- }
- },
- "json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
- "dev": true
- },
- "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=",
- "dev": true
- },
- "json5": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
- "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
- "dev": true
- },
- "jsonify": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
- "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
- "dev": true
- },
- "jsprim": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
- "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
- "dev": true,
- "requires": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.2.3",
- "verror": "1.10.0"
- }
- },
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- },
- "lazy-cache": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
- "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
- "dev": true,
- "optional": true
- },
- "lcid": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
- "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
- "dev": true,
- "requires": {
- "invert-kv": "^1.0.0"
- }
- },
- "lcov-parse": {
- "version": "0.0.10",
- "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz",
- "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=",
- "dev": true
- },
- "left-pad": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz",
- "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==",
- "dev": true
- },
- "leven": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz",
- "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=",
- "dev": true
- },
- "levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
- "dev": true,
- "requires": {
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2"
- }
- },
- "lint-staged": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-6.1.1.tgz",
- "integrity": "sha512-M/7bwLdXbeG7ZNLcasGeLMBDg60/w6obj3KOtINwJyxAxb53XGY0yH5FSZlWklEzuVbTtqtIfAajh6jYIN90AA==",
- "dev": true,
- "requires": {
- "app-root-path": "^2.0.0",
- "chalk": "^2.1.0",
- "commander": "^2.11.0",
- "cosmiconfig": "^4.0.0",
- "debug": "^3.1.0",
- "dedent": "^0.7.0",
- "execa": "^0.8.0",
- "find-parent-dir": "^0.3.0",
- "is-glob": "^4.0.0",
- "jest-validate": "^21.1.0",
- "listr": "^0.13.0",
- "lodash": "^4.17.4",
- "log-symbols": "^2.0.0",
- "minimatch": "^3.0.0",
- "npm-which": "^3.0.1",
- "p-map": "^1.1.1",
- "path-is-inside": "^1.0.2",
- "pify": "^3.0.0",
- "staged-git-files": "1.0.0",
- "stringify-object": "^3.2.0"
- },
- "dependencies": {
- "execa": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz",
- "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=",
- "dev": true,
- "requires": {
- "cross-spawn": "^5.0.1",
- "get-stream": "^3.0.0",
- "is-stream": "^1.1.0",
- "npm-run-path": "^2.0.0",
- "p-finally": "^1.0.0",
- "signal-exit": "^3.0.0",
- "strip-eof": "^1.0.0"
- }
- },
- "is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
- "dev": true
- },
- "is-glob": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
- "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
- "dev": true,
- "requires": {
- "is-extglob": "^2.1.1"
- }
- },
- "jest-get-type": {
- "version": "21.2.0",
- "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-21.2.0.tgz",
- "integrity": "sha512-y2fFw3C+D0yjNSDp7ab1kcd6NUYfy3waPTlD8yWkAtiocJdBRQqNoRqVfMNxgj+IjT0V5cBIHJO0z9vuSSZ43Q==",
- "dev": true
- },
- "jest-validate": {
- "version": "21.2.1",
- "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-21.2.1.tgz",
- "integrity": "sha512-k4HLI1rZQjlU+EC682RlQ6oZvLrE5SCh3brseQc24vbZTxzT/k/3urar5QMCVgjadmSO7lECeGdc6YxnM3yEGg==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.1",
- "jest-get-type": "^21.2.0",
- "leven": "^2.1.0",
- "pretty-format": "^21.2.1"
- }
- },
- "pretty-format": {
- "version": "21.2.1",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-21.2.1.tgz",
- "integrity": "sha512-ZdWPGYAnYfcVP8yKA3zFjCn8s4/17TeYH28MXuC8vTp0o21eXjbFGcOAXZEaDaOFJjc3h2qa7HQNHNshhvoh2A==",
- "dev": true,
- "requires": {
- "ansi-regex": "^3.0.0",
- "ansi-styles": "^3.2.0"
- }
- }
- }
- },
- "listr": {
- "version": "0.13.0",
- "resolved": "https://registry.npmjs.org/listr/-/listr-0.13.0.tgz",
- "integrity": "sha1-ILsLowuuZg7oTMBQPfS+PVYjiH0=",
- "dev": true,
- "requires": {
- "chalk": "^1.1.3",
- "cli-truncate": "^0.2.1",
- "figures": "^1.7.0",
- "indent-string": "^2.1.0",
- "is-observable": "^0.2.0",
- "is-promise": "^2.1.0",
- "is-stream": "^1.1.0",
- "listr-silent-renderer": "^1.1.1",
- "listr-update-renderer": "^0.4.0",
- "listr-verbose-renderer": "^0.4.0",
- "log-symbols": "^1.0.2",
- "log-update": "^1.0.2",
- "ora": "^0.2.3",
- "p-map": "^1.1.1",
- "rxjs": "^5.4.2",
- "stream-to-observable": "^0.2.0",
- "strip-ansi": "^3.0.1"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "dev": true
- },
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dev": true,
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "figures": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
- "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
- "dev": true,
- "requires": {
- "escape-string-regexp": "^1.0.5",
- "object-assign": "^4.1.0"
- }
- },
- "log-symbols": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz",
- "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=",
- "dev": true,
- "requires": {
- "chalk": "^1.0.0"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "dev": true,
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
- "dev": true
- }
- }
- },
- "listr-silent-renderer": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz",
- "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=",
- "dev": true
- },
- "listr-update-renderer": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.4.0.tgz",
- "integrity": "sha1-NE2YDaLKLosUW6MFkI8yrj9MyKc=",
- "dev": true,
- "requires": {
- "chalk": "^1.1.3",
- "cli-truncate": "^0.2.1",
- "elegant-spinner": "^1.0.1",
- "figures": "^1.7.0",
- "indent-string": "^3.0.0",
- "log-symbols": "^1.0.2",
- "log-update": "^1.0.2",
- "strip-ansi": "^3.0.1"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "dev": true
- },
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dev": true,
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "figures": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
- "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
- "dev": true,
- "requires": {
- "escape-string-regexp": "^1.0.5",
- "object-assign": "^4.1.0"
- }
- },
- "indent-string": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz",
- "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=",
- "dev": true
- },
- "log-symbols": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz",
- "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=",
- "dev": true,
- "requires": {
- "chalk": "^1.0.0"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "dev": true,
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
- "dev": true
- }
- }
- },
- "listr-verbose-renderer": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz",
- "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=",
- "dev": true,
- "requires": {
- "chalk": "^1.1.3",
- "cli-cursor": "^1.0.2",
- "date-fns": "^1.27.2",
- "figures": "^1.7.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "dev": true
- },
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dev": true,
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "cli-cursor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz",
- "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=",
- "dev": true,
- "requires": {
- "restore-cursor": "^1.0.1"
- }
- },
- "figures": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
- "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
- "dev": true,
- "requires": {
- "escape-string-regexp": "^1.0.5",
- "object-assign": "^4.1.0"
- }
- },
- "onetime": {
- "version": "1.1.0",
- "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
- "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
- "dev": true
- },
- "restore-cursor": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz",
- "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=",
- "dev": true,
- "requires": {
- "exit-hook": "^1.0.0",
- "onetime": "^1.0.0"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "dev": true,
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
- "dev": true
- }
- }
- },
- "load-json-file": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
- "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
- "requires": {
- "graceful-fs": "^4.1.2",
- "parse-json": "^4.0.0",
- "pify": "^3.0.0",
- "strip-bom": "^3.0.0"
- }
- },
- "locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
- "requires": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "lodash": {
- "version": "4.17.10",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
- "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg=="
- },
- "lodash.sortby": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
- "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
- "dev": true
- },
- "log-driver": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz",
- "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==",
- "dev": true
- },
- "log-symbols": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
- "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
- "requires": {
- "chalk": "^2.0.1"
- }
- },
- "log-update": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/log-update/-/log-update-1.0.2.tgz",
- "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=",
- "dev": true,
- "requires": {
- "ansi-escapes": "^1.0.0",
- "cli-cursor": "^1.0.2"
- },
- "dependencies": {
- "ansi-escapes": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz",
- "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=",
- "dev": true
- },
- "cli-cursor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz",
- "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=",
- "dev": true,
- "requires": {
- "restore-cursor": "^1.0.1"
- }
- },
- "onetime": {
- "version": "1.1.0",
- "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
- "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
- "dev": true
- },
- "restore-cursor": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz",
- "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=",
- "dev": true,
- "requires": {
- "exit-hook": "^1.0.0",
- "onetime": "^1.0.0"
- }
- }
- }
- },
- "lolex": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz",
- "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=",
- "dev": true
- },
- "longest": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
- "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
- "dev": true
- },
- "loose-envify": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
- "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
- "dev": true,
- "requires": {
- "js-tokens": "^3.0.0"
- }
- },
- "lowercase-keys": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
- "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
- },
- "lru-cache": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz",
- "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==",
- "requires": {
- "pseudomap": "^1.0.2",
- "yallist": "^2.1.2"
- }
- },
- "make-dir": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz",
- "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==",
- "requires": {
- "pify": "^3.0.0"
- }
- },
- "makeerror": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz",
- "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=",
- "dev": true,
- "requires": {
- "tmpl": "1.0.x"
- }
- },
- "map-cache": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
- "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
- "dev": true
- },
- "map-visit": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
- "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
- "dev": true,
- "requires": {
- "object-visit": "^1.0.0"
- }
- },
- "mem": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
- "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
- "dev": true,
- "requires": {
- "mimic-fn": "^1.0.0"
- }
- },
- "mem-fs": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/mem-fs/-/mem-fs-1.1.3.tgz",
- "integrity": "sha1-uK6NLj/Lb10/kWXBLUVRoGXZicw=",
- "requires": {
- "through2": "^2.0.0",
- "vinyl": "^1.1.0",
- "vinyl-file": "^2.0.0"
- },
- "dependencies": {
- "clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
- },
- "clone-stats": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
- "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE="
- },
- "replace-ext": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
- "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ="
- },
- "vinyl": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz",
- "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
- "requires": {
- "clone": "^1.0.0",
- "clone-stats": "^0.0.1",
- "replace-ext": "0.0.1"
- }
- }
- }
- },
- "mem-fs-editor": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-3.0.2.tgz",
- "integrity": "sha1-3Qpuryu4prN3QAZ6pUnrUwEFr58=",
- "requires": {
- "commondir": "^1.0.1",
- "deep-extend": "^0.4.0",
- "ejs": "^2.3.1",
- "glob": "^7.0.3",
- "globby": "^6.1.0",
- "mkdirp": "^0.5.0",
- "multimatch": "^2.0.0",
- "rimraf": "^2.2.8",
- "through2": "^2.0.0",
- "vinyl": "^2.0.1"
- }
- },
- "merge": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz",
- "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=",
- "dev": true
- },
- "merge-stream": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz",
- "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=",
- "dev": true,
- "requires": {
- "readable-stream": "^2.0.1"
- }
- },
- "micromatch": {
- "version": "2.3.11",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
- "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
- "dev": true,
- "requires": {
- "arr-diff": "^2.0.0",
- "array-unique": "^0.2.1",
- "braces": "^1.8.2",
- "expand-brackets": "^0.1.4",
- "extglob": "^0.3.1",
- "filename-regex": "^2.0.0",
- "is-extglob": "^1.0.0",
- "is-glob": "^2.0.1",
- "kind-of": "^3.0.2",
- "normalize-path": "^2.0.1",
- "object.omit": "^2.0.0",
- "parse-glob": "^3.0.4",
- "regex-cache": "^0.4.2"
- },
- "dependencies": {
- "normalize-path": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
- "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
- "dev": true,
- "requires": {
- "remove-trailing-separator": "^1.0.1"
- }
- }
- }
- },
- "mime-db": {
- "version": "1.33.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
- "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==",
- "dev": true
- },
- "mime-types": {
- "version": "2.1.18",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
- "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
- "dev": true,
- "requires": {
- "mime-db": "~1.33.0"
- }
- },
- "mimic-fn": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
- "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="
- },
- "mimic-response": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz",
- "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4="
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "minimist": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
- },
- "mixin-deep": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
- "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
- "dev": true,
- "requires": {
- "for-in": "^1.0.2",
- "is-extendable": "^1.0.1"
- },
- "dependencies": {
- "is-extendable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
- "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
- "dev": true,
- "requires": {
- "is-plain-object": "^2.0.4"
- }
- }
- }
- },
- "mkdirp": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
- "requires": {
- "minimist": "0.0.8"
- },
- "dependencies": {
- "minimist": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
- }
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "multimatch": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz",
- "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=",
- "requires": {
- "array-differ": "^1.0.0",
- "array-union": "^1.0.1",
- "arrify": "^1.0.0",
- "minimatch": "^3.0.0"
- }
- },
- "mute-stream": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
- "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
- },
- "nan": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
- "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==",
- "dev": true,
- "optional": true
- },
- "nanomatch": {
- "version": "1.2.9",
- "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
- "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
- "dev": true,
- "requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "fragment-cache": "^0.2.1",
- "is-odd": "^2.0.0",
- "is-windows": "^1.0.2",
- "kind-of": "^6.0.2",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "arr-diff": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
- "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
- "dev": true
- },
- "array-unique": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
- "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
- "dev": true
- },
- "kind-of": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
- "dev": true
- }
- }
- },
- "native-promise-only": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz",
- "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=",
- "dev": true
- },
- "natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
- "dev": true
- },
- "node-int64": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
- "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=",
- "dev": true
- },
- "node-notifier": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.2.1.tgz",
- "integrity": "sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg==",
- "dev": true,
- "requires": {
- "growly": "^1.3.0",
- "semver": "^5.4.1",
- "shellwords": "^0.1.1",
- "which": "^1.3.0"
- }
- },
- "normalize-package-data": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
- "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
- "requires": {
- "hosted-git-info": "^2.1.4",
- "is-builtin-module": "^1.0.0",
- "semver": "2 || 3 || 4 || 5",
- "validate-npm-package-license": "^3.0.1"
- }
- },
- "normalize-path": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz",
- "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=",
- "dev": true
- },
- "npm-path": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/npm-path/-/npm-path-2.0.4.tgz",
- "integrity": "sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw==",
- "dev": true,
- "requires": {
- "which": "^1.2.10"
- }
- },
- "npm-run-path": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
- "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
- "dev": true,
- "requires": {
- "path-key": "^2.0.0"
- }
- },
- "npm-which": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/npm-which/-/npm-which-3.0.1.tgz",
- "integrity": "sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo=",
- "dev": true,
- "requires": {
- "commander": "^2.9.0",
- "npm-path": "^2.0.2",
- "which": "^1.2.10"
- }
- },
- "nsp": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/nsp/-/nsp-2.8.1.tgz",
- "integrity": "sha512-jvjDg2Gsw4coD/iZ5eQddsDlkvnwMCNnpG05BproSnuG+Gr1bSQMwWMcQeYje+qdDl3XznmhblMPLpZLecTORQ==",
- "dev": true,
- "requires": {
- "chalk": "^1.1.1",
- "cli-table": "^0.3.1",
- "cvss": "^1.0.0",
- "https-proxy-agent": "^1.0.0",
- "joi": "^6.9.1",
- "nodesecurity-npm-utils": "^5.0.0",
- "path-is-absolute": "^1.0.0",
- "rc": "^1.1.2",
- "semver": "^5.0.3",
- "subcommand": "^2.0.3",
- "wreck": "^6.3.0"
- },
- "dependencies": {
- "agent-base": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz",
- "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=",
- "dev": true,
- "requires": {
- "extend": "~3.0.0",
- "semver": "~5.0.1"
- },
- "dependencies": {
- "semver": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz",
- "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=",
- "dev": true
- }
- }
- },
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "dev": true
- },
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "boom": {
- "version": "2.10.1",
- "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
- "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
- "dev": true,
- "requires": {
- "hoek": "2.x.x"
- }
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dev": true,
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "cli-table": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz",
- "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=",
- "dev": true,
- "requires": {
- "colors": "1.0.3"
- }
- },
- "cliclopts": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/cliclopts/-/cliclopts-1.1.1.tgz",
- "integrity": "sha1-aUMcfLWvcjd0sNORG0w3USQxkQ8=",
- "dev": true
- },
- "colors": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
- "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
- "dev": true
- },
- "cvss": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/cvss/-/cvss-1.0.2.tgz",
- "integrity": "sha1-32fpK/EqeW9J6Sh5nI2zunS5/NY=",
- "dev": true
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "deep-extend": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
- "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=",
- "dev": true
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
- "dev": true
- },
- "extend": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
- "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
- "dev": true
- },
- "has-ansi": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
- "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
- "dev": true,
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "hoek": {
- "version": "2.16.3",
- "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
- "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=",
- "dev": true
- },
- "https-proxy-agent": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz",
- "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=",
- "dev": true,
- "requires": {
- "agent-base": "2",
- "debug": "2",
- "extend": "3"
- }
- },
- "ini": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz",
- "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=",
- "dev": true
- },
- "isemail": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz",
- "integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo=",
- "dev": true
- },
- "joi": {
- "version": "6.10.1",
- "resolved": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz",
- "integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY=",
- "dev": true,
- "requires": {
- "hoek": "2.x.x",
- "isemail": "1.x.x",
- "moment": "2.x.x",
- "topo": "1.x.x"
- }
- },
- "minimist": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
- "dev": true
- },
- "moment": {
- "version": "2.18.1",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz",
- "integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8=",
- "dev": true
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- },
- "nodesecurity-npm-utils": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/nodesecurity-npm-utils/-/nodesecurity-npm-utils-5.0.0.tgz",
- "integrity": "sha1-Baow3jDKjIRcQEjpT9eOXgi1Xtk=",
- "dev": true
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "dev": true
- },
- "rc": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz",
- "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=",
- "dev": true,
- "requires": {
- "deep-extend": "~0.4.0",
- "ini": "~1.3.0",
- "minimist": "^1.2.0",
- "strip-json-comments": "~2.0.1"
- }
- },
- "semver": {
- "version": "5.4.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz",
- "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==",
- "dev": true
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "dev": true,
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
- "dev": true
- },
- "subcommand": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/subcommand/-/subcommand-2.1.0.tgz",
- "integrity": "sha1-XkzspaN3njNlsVEeBfhmh3MC92A=",
- "dev": true,
- "requires": {
- "cliclopts": "^1.1.0",
- "debug": "^2.1.3",
- "minimist": "^1.2.0",
- "xtend": "^4.0.0"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
- "dev": true
- },
- "topo": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz",
- "integrity": "sha1-6ddRYV0buH3IZdsYL6HKCl71NtU=",
- "dev": true,
- "requires": {
- "hoek": "2.x.x"
- }
- },
- "wreck": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/wreck/-/wreck-6.3.0.tgz",
- "integrity": "sha1-oTaXafB7u2LWo3gzanhx/Hc8dAs=",
- "dev": true,
- "requires": {
- "boom": "2.x.x",
- "hoek": "2.x.x"
- }
- },
- "xtend": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
- "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
- "dev": true
- }
- }
- },
- "number-is-nan": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
- "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
- },
- "nwmatcher": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz",
- "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==",
- "dev": true
- },
- "oauth-sign": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
- "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
- "dev": true
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
- },
- "object-copy": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
- "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
- "dev": true,
- "requires": {
- "copy-descriptor": "^0.1.0",
- "define-property": "^0.2.5",
- "kind-of": "^3.0.3"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- }
- }
- },
- "object-keys": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz",
- "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=",
- "dev": true
- },
- "object-visit": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
- "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
- "dev": true,
- "requires": {
- "isobject": "^3.0.0"
- },
- "dependencies": {
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- }
- }
- },
- "object.getownpropertydescriptors": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz",
- "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.2",
- "es-abstract": "^1.5.1"
- }
- },
- "object.omit": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
- "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
- "dev": true,
- "requires": {
- "for-own": "^0.1.4",
- "is-extendable": "^0.1.1"
- }
- },
- "object.pick": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
- "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
- "dev": true,
- "requires": {
- "isobject": "^3.0.1"
- },
- "dependencies": {
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- }
- }
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "requires": {
- "wrappy": "1"
- }
- },
- "onetime": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
- "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
- "requires": {
- "mimic-fn": "^1.0.0"
- }
- },
- "optimist": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
- "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
- "dev": true,
- "requires": {
- "minimist": "~0.0.1",
- "wordwrap": "~0.0.2"
- },
- "dependencies": {
- "minimist": {
- "version": "0.0.10",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
- "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=",
- "dev": true
- },
- "wordwrap": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
- "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
- "dev": true
- }
- }
- },
- "optionator": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
- "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
- "dev": true,
- "requires": {
- "deep-is": "~0.1.3",
- "fast-levenshtein": "~2.0.4",
- "levn": "~0.3.0",
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2",
- "wordwrap": "~1.0.0"
- }
- },
- "ora": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/ora/-/ora-0.2.3.tgz",
- "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=",
- "dev": true,
- "requires": {
- "chalk": "^1.1.1",
- "cli-cursor": "^1.0.2",
- "cli-spinners": "^0.1.2",
- "object-assign": "^4.0.1"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "dev": true
- },
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dev": true,
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "cli-cursor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz",
- "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=",
- "dev": true,
- "requires": {
- "restore-cursor": "^1.0.1"
- }
- },
- "onetime": {
- "version": "1.1.0",
- "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
- "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
- "dev": true
- },
- "restore-cursor": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz",
- "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=",
- "dev": true,
- "requires": {
- "exit-hook": "^1.0.0",
- "onetime": "^1.0.0"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "dev": true,
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
- "dev": true
- }
- }
- },
- "os-homedir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
- "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
- "dev": true
- },
- "os-locale": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
- "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
- "dev": true,
- "requires": {
- "execa": "^0.7.0",
- "lcid": "^1.0.0",
- "mem": "^1.1.0"
- }
- },
- "os-shim": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz",
- "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=",
- "dev": true
- },
- "os-tmpdir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
- },
- "p-cancelable": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz",
- "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw=="
- },
- "p-finally": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
- "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
- },
- "p-limit": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz",
- "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==",
- "requires": {
- "p-try": "^1.0.0"
- }
- },
- "p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
- "requires": {
- "p-limit": "^1.1.0"
- }
- },
- "p-map": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
- "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
- "dev": true
- },
- "p-timeout": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz",
- "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=",
- "requires": {
- "p-finally": "^1.0.0"
- }
- },
- "p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
- },
- "pad-component": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/pad-component/-/pad-component-0.0.1.tgz",
- "integrity": "sha1-rR8izhvw/cDW3dkIrxfzUaQEuKw="
- },
- "parse-glob": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
- "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
- "dev": true,
- "requires": {
- "glob-base": "^0.3.0",
- "is-dotfile": "^1.0.0",
- "is-extglob": "^1.0.0",
- "is-glob": "^2.0.0"
- }
- },
- "parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
- "requires": {
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1"
- }
- },
- "parse5": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
- "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
- "dev": true
- },
- "pascalcase": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
- "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
- "dev": true
- },
- "path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
- },
- "path-is-inside": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
- "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
- "dev": true
- },
- "path-key": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
- "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
- "dev": true
- },
- "path-parse": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
- "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME="
- },
- "path-to-regexp": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz",
- "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=",
- "dev": true,
- "requires": {
- "isarray": "0.0.1"
- },
- "dependencies": {
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
- "dev": true
- }
- }
- },
- "path-type": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
- "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
- "requires": {
- "pify": "^3.0.0"
- }
- },
- "performance-now": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
- "dev": true
- },
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
- },
- "pinkie": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
- "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
- },
- "pinkie-promise": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
- "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
- "requires": {
- "pinkie": "^2.0.0"
- }
- },
- "pkg-dir": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
- "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
- "dev": true,
- "requires": {
- "find-up": "^2.1.0"
- }
- },
- "pluralize": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
- "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==",
- "dev": true
- },
- "pn": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz",
- "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==",
- "dev": true
- },
- "posix-character-classes": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
- "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
- "dev": true
- },
- "prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
- "dev": true
- },
- "prepend-http": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
- "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
- },
- "preserve": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
- "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
- "dev": true
- },
- "prettier": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.12.1.tgz",
- "integrity": "sha1-wa0g6APndJ+vkFpAnSNn4Gu+cyU=",
- "dev": true
- },
- "pretty-bytes": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz",
- "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk="
- },
- "pretty-format": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz",
- "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==",
- "dev": true,
- "requires": {
- "ansi-regex": "^3.0.0",
- "ansi-styles": "^3.2.0"
- }
- },
- "private": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
- "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
- "dev": true
- },
- "process-nextick-args": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
- "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
- },
- "progress": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz",
- "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=",
- "dev": true
- },
- "pseudomap": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
- "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
- },
- "punycode": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
- "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
- "dev": true
- },
- "qs": {
- "version": "6.5.1",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
- "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
- "dev": true
- },
- "randomatic": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz",
- "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==",
- "dev": true,
- "requires": {
- "is-number": "^3.0.0",
- "kind-of": "^4.0.0"
- },
- "dependencies": {
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "kind-of": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
- "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "read-chunk": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-2.1.0.tgz",
- "integrity": "sha1-agTAkoAF7Z1C4aasVgDhnLx/9lU=",
- "requires": {
- "pify": "^3.0.0",
- "safe-buffer": "^5.1.1"
- }
- },
- "read-pkg": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
- "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
- "requires": {
- "load-json-file": "^4.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^3.0.0"
- }
- },
- "read-pkg-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz",
- "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=",
- "requires": {
- "find-up": "^2.0.0",
- "read-pkg": "^3.0.0"
- }
- },
- "readable-stream": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
- "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "realpath-native": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.0.0.tgz",
- "integrity": "sha512-XJtlRJ9jf0E1H1SLeJyQ9PGzQD7S65h1pRXEcAeK48doKOnKxcgPeNohJvD5u/2sI9J1oke6E8bZHS/fmW1UiQ==",
- "dev": true,
- "requires": {
- "util.promisify": "^1.0.0"
- }
- },
- "rechoir": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
- "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
- "requires": {
- "resolve": "^1.1.6"
- }
- },
- "regenerator-runtime": {
- "version": "0.11.1",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
- "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
- "dev": true
- },
- "regex-cache": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
- "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
- "dev": true,
- "requires": {
- "is-equal-shallow": "^0.1.3"
- }
- },
- "regex-not": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
- "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
- "dev": true,
- "requires": {
- "extend-shallow": "^3.0.2",
- "safe-regex": "^1.1.0"
- }
- },
- "regexpp": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz",
- "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==",
- "dev": true
- },
- "remove-trailing-separator": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
- "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
- },
- "repeat-element": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
- "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
- "dev": true
- },
- "repeat-string": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
- "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
- "dev": true
- },
- "repeating": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
- "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
- "dev": true,
- "requires": {
- "is-finite": "^1.0.0"
- }
- },
- "replace-ext": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
- "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs="
- },
- "request": {
- "version": "2.85.0",
- "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz",
- "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==",
- "dev": true,
- "requires": {
- "aws-sign2": "~0.7.0",
- "aws4": "^1.6.0",
- "caseless": "~0.12.0",
- "combined-stream": "~1.0.5",
- "extend": "~3.0.1",
- "forever-agent": "~0.6.1",
- "form-data": "~2.3.1",
- "har-validator": "~5.0.3",
- "hawk": "~6.0.2",
- "http-signature": "~1.2.0",
- "is-typedarray": "~1.0.0",
- "isstream": "~0.1.2",
- "json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.17",
- "oauth-sign": "~0.8.2",
- "performance-now": "^2.1.0",
- "qs": "~6.5.1",
- "safe-buffer": "^5.1.1",
- "stringstream": "~0.0.5",
- "tough-cookie": "~2.3.3",
- "tunnel-agent": "^0.6.0",
- "uuid": "^3.1.0"
- }
- },
- "request-promise-core": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz",
- "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=",
- "dev": true,
- "requires": {
- "lodash": "^4.13.1"
- }
- },
- "request-promise-native": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz",
- "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=",
- "dev": true,
- "requires": {
- "request-promise-core": "1.1.1",
- "stealthy-require": "^1.1.0",
- "tough-cookie": ">=2.3.3"
- }
- },
- "require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
- "dev": true
- },
- "require-from-string": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.1.tgz",
- "integrity": "sha1-xUUjPp19pmFunVmt+zn8n1iGdv8=",
- "dev": true
- },
- "require-main-filename": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
- "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
- "dev": true
- },
- "require-uncached": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
- "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
- "dev": true,
- "requires": {
- "caller-path": "^0.1.0",
- "resolve-from": "^1.0.0"
- }
- },
- "resolve": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz",
- "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==",
- "requires": {
- "path-parse": "^1.0.5"
- }
- },
- "resolve-cwd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
- "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
- "dev": true,
- "requires": {
- "resolve-from": "^3.0.0"
- },
- "dependencies": {
- "resolve-from": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
- "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
- "dev": true
- }
- }
- },
- "resolve-from": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
- "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=",
- "dev": true
- },
- "resolve-url": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
- "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
- "dev": true
- },
- "restore-cursor": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
- "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
- "requires": {
- "onetime": "^2.0.0",
- "signal-exit": "^3.0.2"
- }
- },
- "ret": {
- "version": "0.1.15",
- "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
- "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
- "dev": true
- },
- "right-align": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
- "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
- "dev": true,
- "optional": true,
- "requires": {
- "align-text": "^0.1.1"
- }
- },
- "rimraf": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
- "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
- "requires": {
- "glob": "^7.0.5"
- }
- },
- "run-async": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
- "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
- "requires": {
- "is-promise": "^2.1.0"
- }
- },
- "rx": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz",
- "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=",
- "dev": true
- },
- "rx-lite": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
- "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ="
- },
- "rx-lite-aggregates": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz",
- "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=",
- "requires": {
- "rx-lite": "*"
- }
- },
- "rxjs": {
- "version": "5.5.8",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.8.tgz",
- "integrity": "sha512-Bz7qou7VAIoGiglJZbzbXa4vpX5BmTTN2Dj/se6+SwADtw4SihqBIiEa7VmTXJ8pynvq0iFr5Gx9VLyye1rIxQ==",
- "dev": true,
- "requires": {
- "symbol-observable": "1.0.1"
- },
- "dependencies": {
- "symbol-observable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz",
- "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=",
- "dev": true
- }
- }
- },
- "safe-buffer": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
- "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
- },
- "safe-regex": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
- "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
- "dev": true,
- "requires": {
- "ret": "~0.1.10"
- }
- },
- "safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
- },
- "samsam": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz",
- "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==",
- "dev": true
- },
- "sane": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.0.tgz",
- "integrity": "sha512-glfKd7YH4UCrh/7dD+UESsr8ylKWRE7UQPoXuz28FgmcF0ViJQhCTCCZHICRKxf8G8O1KdLEn20dcICK54c7ew==",
- "dev": true,
- "requires": {
- "anymatch": "^2.0.0",
- "exec-sh": "^0.2.0",
- "fb-watchman": "^2.0.0",
- "fsevents": "^1.1.1",
- "micromatch": "^3.1.4",
- "minimist": "^1.1.1",
- "walker": "~1.0.5",
- "watch": "~0.18.0"
- },
- "dependencies": {
- "arr-diff": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
- "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
- "dev": true
- },
- "array-unique": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
- "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
- "dev": true
- },
- "braces": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
- "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
- "dev": true,
- "requires": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "expand-brackets": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
- "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
- "dev": true,
- "requires": {
- "debug": "^2.3.3",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "posix-character-classes": "^0.1.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
- "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "is-data-descriptor": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
- "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "is-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
- "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^0.1.6",
- "is-data-descriptor": "^0.1.4",
- "kind-of": "^5.0.0"
- }
- },
- "kind-of": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
- "dev": true
- }
- }
- },
- "extglob": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
- "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
- "dev": true,
- "requires": {
- "array-unique": "^0.3.2",
- "define-property": "^1.0.0",
- "expand-brackets": "^2.1.4",
- "extend-shallow": "^2.0.1",
- "fragment-cache": "^0.2.1",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "fill-range": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
- "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
- "dev": true,
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- },
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- },
- "kind-of": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
- "dev": true
- },
- "micromatch": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
- "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
- "dev": true,
- "requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "braces": "^2.3.1",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "extglob": "^2.0.4",
- "fragment-cache": "^0.2.1",
- "kind-of": "^6.0.2",
- "nanomatch": "^1.2.9",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
- }
- }
- }
- },
- "sax": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
- "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
- "dev": true
- },
- "scoped-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-1.0.0.tgz",
- "integrity": "sha1-o0a7Gs1CB65wvXwMfKnlZra63bg="
- },
- "semver": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
- "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
- },
- "set-blocking": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
- "dev": true
- },
- "set-value": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
- "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
- "dev": true,
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-extendable": "^0.1.1",
- "is-plain-object": "^2.0.3",
- "split-string": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "shebang-command": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
- "requires": {
- "shebang-regex": "^1.0.0"
- }
- },
- "shebang-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
- },
- "shelljs": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.1.tgz",
- "integrity": "sha512-YA/iYtZpzFe5HyWVGrb02FjPxc4EMCfpoU/Phg9fQoyMC72u9598OUBrsU8IrtwAKG0tO8IYaqbaLIw+k3IRGA==",
- "requires": {
- "glob": "^7.0.0",
- "interpret": "^1.0.0",
- "rechoir": "^0.6.2"
- }
- },
- "shellwords": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz",
- "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==",
- "dev": true
- },
- "signal-exit": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
- },
- "sinon": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.4.1.tgz",
- "integrity": "sha512-vFTrO9Wt0ECffDYIPSP/E5bBugt0UjcBQOfQUMh66xzkyPEnhl/vM2LRZi2ajuTdkH07sA6DzrM6KvdvGIH8xw==",
- "dev": true,
- "requires": {
- "diff": "^3.1.0",
- "formatio": "1.2.0",
- "lolex": "^1.6.0",
- "native-promise-only": "^0.8.1",
- "path-to-regexp": "^1.7.0",
- "samsam": "^1.1.3",
- "text-encoding": "0.6.4",
- "type-detect": "^4.0.0"
- }
- },
- "slash": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
- "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
- "dev": true
- },
- "slice-ansi": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
- "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
- "dev": true,
- "requires": {
- "is-fullwidth-code-point": "^2.0.0"
- }
- },
- "snapdragon": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
- "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
- "dev": true,
- "requires": {
- "base": "^0.11.1",
- "debug": "^2.2.0",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "map-cache": "^0.2.2",
- "source-map": "^0.5.6",
- "source-map-resolve": "^0.5.0",
- "use": "^3.1.0"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "snapdragon-node": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
- "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
- "dev": true,
- "requires": {
- "define-property": "^1.0.0",
- "isobject": "^3.0.0",
- "snapdragon-util": "^3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- },
- "kind-of": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
- "dev": true
- }
- }
- },
- "snapdragon-util": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
- "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
- "dev": true,
- "requires": {
- "kind-of": "^3.2.0"
- }
- },
- "sntp": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz",
- "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==",
- "dev": true,
- "requires": {
- "hoek": "4.x.x"
- }
- },
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
- "dev": true
- },
- "source-map-resolve": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
- "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
- "dev": true,
- "requires": {
- "atob": "^2.0.0",
- "decode-uri-component": "^0.2.0",
- "resolve-url": "^0.2.1",
- "source-map-url": "^0.4.0",
- "urix": "^0.1.0"
- }
- },
- "source-map-support": {
- "version": "0.5.4",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.4.tgz",
- "integrity": "sha512-PETSPG6BjY1AHs2t64vS2aqAgu6dMIMXJULWFBGbh2Gr8nVLbCFDo6i/RMMvviIQ2h1Z8+5gQhVKSn2je9nmdg==",
- "dev": true,
- "requires": {
- "source-map": "^0.6.0"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- }
- }
- },
- "source-map-url": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
- "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
- "dev": true
- },
- "spawn-sync": {
- "version": "1.0.15",
- "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz",
- "integrity": "sha1-sAeZVX63+wyDdsKdROih6mfldHY=",
- "dev": true,
- "requires": {
- "concat-stream": "^1.4.7",
- "os-shim": "^0.1.2"
- }
- },
- "spdx-correct": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz",
- "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==",
- "requires": {
- "spdx-expression-parse": "^3.0.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "spdx-exceptions": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz",
- "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg=="
- },
- "spdx-expression-parse": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
- "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
- "requires": {
- "spdx-exceptions": "^2.1.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "spdx-license-ids": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz",
- "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA=="
- },
- "split-string": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
- "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
- "dev": true,
- "requires": {
- "extend-shallow": "^3.0.0"
- }
- },
- "sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
- "dev": true
- },
- "sshpk": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz",
- "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=",
- "dev": true,
- "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",
- "tweetnacl": "~0.14.0"
- }
- },
- "stack-utils": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz",
- "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=",
- "dev": true
- },
- "staged-git-files": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/staged-git-files/-/staged-git-files-1.0.0.tgz",
- "integrity": "sha1-zbhHg3wfzFLAioctSIPMCHdmioA=",
- "dev": true
- },
- "static-extend": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
- "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
- "dev": true,
- "requires": {
- "define-property": "^0.2.5",
- "object-copy": "^0.1.0"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- }
- }
- },
- "stealthy-require": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
- "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=",
- "dev": true
- },
- "stream-to-observable": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/stream-to-observable/-/stream-to-observable-0.2.0.tgz",
- "integrity": "sha1-WdbqOT2HwsDdrBCqDVYbxrpvDhA=",
- "dev": true,
- "requires": {
- "any-observable": "^0.2.0"
- }
- },
- "string-length": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz",
- "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=",
- "dev": true,
- "requires": {
- "astral-regex": "^1.0.0",
- "strip-ansi": "^4.0.0"
- }
- },
- "string-template": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz",
- "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0="
- },
- "string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
- "requires": {
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- },
- "stringify-object": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.2.2.tgz",
- "integrity": "sha512-O696NF21oLiDy8PhpWu8AEqoZHw++QW6mUv0UvKZe8gWSdSvMXkiLufK7OmnP27Dro4GU5kb9U7JIO0mBuCRQg==",
- "dev": true,
- "requires": {
- "get-own-enumerable-property-symbols": "^2.0.1",
- "is-obj": "^1.0.1",
- "is-regexp": "^1.0.0"
- }
- },
- "stringstream": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
- "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=",
- "dev": true
- },
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "requires": {
- "ansi-regex": "^3.0.0"
- }
- },
- "strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM="
- },
- "strip-bom-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz",
- "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=",
- "requires": {
- "first-chunk-stream": "^2.0.0",
- "strip-bom": "^2.0.0"
- },
- "dependencies": {
- "strip-bom": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
- "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
- "requires": {
- "is-utf8": "^0.2.0"
- }
- }
- }
- },
- "strip-eof": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
- "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
- "dev": true
- },
- "strip-indent": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
- "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
- "dev": true
- },
- "strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
- "dev": true
- },
- "supports-color": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
- "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
- "requires": {
- "has-flag": "^3.0.0"
- }
- },
- "symbol-observable": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-0.2.4.tgz",
- "integrity": "sha1-lag9smGG1q9+ehjb2XYKL4bQj0A=",
- "dev": true
- },
- "symbol-tree": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz",
- "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=",
- "dev": true
- },
- "table": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz",
- "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==",
- "dev": true,
- "requires": {
- "ajv": "^5.2.3",
- "ajv-keywords": "^2.1.0",
- "chalk": "^2.1.0",
- "lodash": "^4.17.4",
- "slice-ansi": "1.0.0",
- "string-width": "^2.1.1"
- }
- },
- "taketalk": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/taketalk/-/taketalk-1.0.0.tgz",
- "integrity": "sha1-tNTw3u0gauffd1sSnqLKbeUvJt0=",
- "requires": {
- "get-stdin": "^4.0.1",
- "minimist": "^1.1.0"
- }
- },
- "test-exclude": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.1.tgz",
- "integrity": "sha512-qpqlP/8Zl+sosLxBcVKl9vYy26T9NPalxSzzCP/OY6K7j938ui2oKgo+kRZYfxAeIpLqpbVnsHq1tyV70E4lWQ==",
- "dev": true,
- "requires": {
- "arrify": "^1.0.1",
- "micromatch": "^3.1.8",
- "object-assign": "^4.1.0",
- "read-pkg-up": "^1.0.1",
- "require-main-filename": "^1.0.1"
- },
- "dependencies": {
- "arr-diff": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
- "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
- "dev": true
- },
- "array-unique": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
- "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
- "dev": true
- },
- "braces": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
- "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
- "dev": true,
- "requires": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "expand-brackets": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
- "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
- "dev": true,
- "requires": {
- "debug": "^2.3.3",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "posix-character-classes": "^0.1.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
- "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "is-data-descriptor": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
- "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "is-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
- "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^0.1.6",
- "is-data-descriptor": "^0.1.4",
- "kind-of": "^5.0.0"
- }
- },
- "kind-of": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
- "dev": true
- }
- }
- },
- "extglob": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
- "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
- "dev": true,
- "requires": {
- "array-unique": "^0.3.2",
- "define-property": "^1.0.0",
- "expand-brackets": "^2.1.4",
- "extend-shallow": "^2.0.1",
- "fragment-cache": "^0.2.1",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "fill-range": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
- "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
- "dev": true,
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "find-up": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
- "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
- "dev": true,
- "requires": {
- "path-exists": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- },
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- },
- "kind-of": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
- "dev": true
- },
- "load-json-file": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
- "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "parse-json": "^2.2.0",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0",
- "strip-bom": "^2.0.0"
- }
- },
- "micromatch": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
- "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
- "dev": true,
- "requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "braces": "^2.3.1",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "extglob": "^2.0.4",
- "fragment-cache": "^0.2.1",
- "kind-of": "^6.0.2",
- "nanomatch": "^1.2.9",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
- }
- },
- "parse-json": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
- "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
- "dev": true,
- "requires": {
- "error-ex": "^1.2.0"
- }
- },
- "path-exists": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
- "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
- "dev": true,
- "requires": {
- "pinkie-promise": "^2.0.0"
- }
- },
- "path-type": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
- "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- }
- },
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
- "dev": true
- },
- "read-pkg": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
- "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
- "dev": true,
- "requires": {
- "load-json-file": "^1.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^1.0.0"
- }
- },
- "read-pkg-up": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
- "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
- "dev": true,
- "requires": {
- "find-up": "^1.0.0",
- "read-pkg": "^1.0.0"
- }
- },
- "strip-bom": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
- "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
- "dev": true,
- "requires": {
- "is-utf8": "^0.2.0"
- }
- }
- }
- },
- "text-encoding": {
- "version": "0.6.4",
- "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz",
- "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=",
- "dev": true
- },
- "text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
- },
- "textextensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.2.0.tgz",
- "integrity": "sha512-j5EMxnryTvKxwH2Cq+Pb43tsf6sdEgw6Pdwxk83mPaq0ToeFJt6WE4J3s5BqY7vmjlLgkgXvhtXUxo80FyBhCA=="
- },
- "throat": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz",
- "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=",
- "dev": true
- },
- "through": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
- "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
- },
- "through2": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
- "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
- "requires": {
- "readable-stream": "^2.1.5",
- "xtend": "~4.0.1"
- }
- },
- "timed-out": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
- "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8="
- },
- "tmp": {
- "version": "0.0.33",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
- "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
- "requires": {
- "os-tmpdir": "~1.0.2"
- }
- },
- "tmpl": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz",
- "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=",
- "dev": true
- },
- "to-fast-properties": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
- "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
- "dev": true
- },
- "to-object-path": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
- "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- }
- },
- "to-regex": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
- "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
- "dev": true,
- "requires": {
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "regex-not": "^1.0.2",
- "safe-regex": "^1.1.0"
- }
- },
- "to-regex-range": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
- "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
- "dev": true,
- "requires": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
- },
- "dependencies": {
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- }
- }
- }
- },
- "tough-cookie": {
- "version": "2.3.4",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
- "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
- "dev": true,
- "requires": {
- "punycode": "^1.4.1"
- }
- },
- "tr46": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
- "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
- "dev": true,
- "requires": {
- "punycode": "^2.1.0"
- },
- "dependencies": {
- "punycode": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
- "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
- "dev": true
- }
- }
- },
- "trim-right": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
- "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
- "dev": true
- },
- "tunnel-agent": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
- "dev": true,
- "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=",
- "dev": true,
- "optional": true
- },
- "type-check": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
- "dev": true,
- "requires": {
- "prelude-ls": "~1.1.2"
- }
- },
- "type-detect": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
- "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
- "dev": true
- },
- "typedarray": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
- "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
- "dev": true
- },
- "uglify-js": {
- "version": "2.8.29",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
- "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
- "dev": true,
- "optional": true,
- "requires": {
- "source-map": "~0.5.1",
- "uglify-to-browserify": "~1.0.0",
- "yargs": "~3.10.0"
- },
- "dependencies": {
- "yargs": {
- "version": "3.10.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
- "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
- "dev": true,
- "optional": true,
- "requires": {
- "camelcase": "^1.0.2",
- "cliui": "^2.1.0",
- "decamelize": "^1.0.0",
- "window-size": "0.1.0"
- }
- }
- }
- },
- "uglify-to-browserify": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
- "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
- "dev": true,
- "optional": true
- },
- "ultron": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
- "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==",
- "dev": true
- },
- "union-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
- "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
- "dev": true,
- "requires": {
- "arr-union": "^3.1.0",
- "get-value": "^2.0.6",
- "is-extendable": "^0.1.1",
- "set-value": "^0.4.3"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- },
- "set-value": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
- "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
- "dev": true,
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-extendable": "^0.1.1",
- "is-plain-object": "^2.0.1",
- "to-object-path": "^0.3.0"
- }
- }
- }
- },
- "unset-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
- "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
- "dev": true,
- "requires": {
- "has-value": "^0.3.1",
- "isobject": "^3.0.0"
- },
- "dependencies": {
- "has-value": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
- "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
- "dev": true,
- "requires": {
- "get-value": "^2.0.3",
- "has-values": "^0.1.4",
- "isobject": "^2.0.0"
- },
- "dependencies": {
- "isobject": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
- "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
- "dev": true,
- "requires": {
- "isarray": "1.0.0"
- }
- }
- }
- },
- "has-values": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
- "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
- "dev": true
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- }
- }
- },
- "untildify": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.2.tgz",
- "integrity": "sha1-fx8wIFWz/qDz6B3HjrNnZstl4/E="
- },
- "unzip-response": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
- "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=",
- "dev": true
- },
- "urix": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
- "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
- "dev": true
- },
- "url-parse-lax": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
- "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
- "requires": {
- "prepend-http": "^1.0.1"
- }
- },
- "url-to-options": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz",
- "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k="
- },
- "use": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
- "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
- "dev": true
- }
- }
- },
- "user-home": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz",
- "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=",
- "dev": true,
- "requires": {
- "os-homedir": "^1.0.0"
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
- },
- "util.promisify": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
- "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.2",
- "object.getownpropertydescriptors": "^2.0.3"
- }
- },
- "uuid": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz",
- "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==",
- "dev": true
- },
- "validate-npm-package-license": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz",
- "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==",
- "requires": {
- "spdx-correct": "^3.0.0",
- "spdx-expression-parse": "^3.0.0"
- }
- },
- "verror": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
- "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "^1.2.0"
- }
- },
- "vinyl": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz",
- "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=",
- "requires": {
- "clone": "^2.1.1",
- "clone-buffer": "^1.0.0",
- "clone-stats": "^1.0.0",
- "cloneable-readable": "^1.0.0",
- "remove-trailing-separator": "^1.0.1",
- "replace-ext": "^1.0.0"
- }
- },
- "vinyl-file": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz",
- "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=",
- "requires": {
- "graceful-fs": "^4.1.2",
- "pify": "^2.3.0",
- "pinkie-promise": "^2.0.0",
- "strip-bom": "^2.0.0",
- "strip-bom-stream": "^2.0.0",
- "vinyl": "^1.1.0"
- },
- "dependencies": {
- "clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
- },
- "clone-stats": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
- "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE="
- },
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
- },
- "replace-ext": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
- "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ="
- },
- "strip-bom": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
- "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
- "requires": {
- "is-utf8": "^0.2.0"
- }
- },
- "vinyl": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz",
- "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
- "requires": {
- "clone": "^1.0.0",
- "clone-stats": "^0.0.1",
- "replace-ext": "0.0.1"
- }
- }
- }
- },
- "w3c-hr-time": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz",
- "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=",
- "dev": true,
- "requires": {
- "browser-process-hrtime": "^0.1.2"
- }
- },
- "walker": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz",
- "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=",
- "dev": true,
- "requires": {
- "makeerror": "1.0.x"
- }
- },
- "watch": {
- "version": "0.18.0",
- "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz",
- "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=",
- "dev": true,
- "requires": {
- "exec-sh": "^0.2.0",
- "minimist": "^1.2.0"
- }
- },
- "webidl-conversions": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
- "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
- "dev": true
- },
- "whatwg-encoding": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz",
- "integrity": "sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw==",
- "dev": true,
- "requires": {
- "iconv-lite": "0.4.19"
- },
- "dependencies": {
- "iconv-lite": {
- "version": "0.4.19",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
- "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==",
- "dev": true
- }
- }
- },
- "whatwg-mimetype": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz",
- "integrity": "sha512-FKxhYLytBQiUKjkYteN71fAUA3g6KpNXoho1isLiLSB3N1G4F35Q5vUxWfKFhBwi5IWF27VE6WxhrnnC+m0Mew==",
- "dev": true
- },
- "whatwg-url": {
- "version": "6.4.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz",
- "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==",
- "dev": true,
- "requires": {
- "lodash.sortby": "^4.7.0",
- "tr46": "^1.0.0",
- "webidl-conversions": "^4.0.1"
- }
- },
- "which": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
- "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
- "requires": {
- "isexe": "^2.0.0"
- }
- },
- "which-module": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
- "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
- "dev": true
- },
- "window-size": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
- "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
- "dev": true,
- "optional": true
- },
- "wordwrap": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
- "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
- "dev": true
- },
- "wrap-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
- "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
- "requires": {
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "requires": {
- "number-is-nan": "^1.0.0"
- }
- },
- "string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- }
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- },
- "write": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
- "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
- "dev": true,
- "requires": {
- "mkdirp": "^0.5.1"
- }
- },
- "write-file-atomic": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz",
- "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.11",
- "imurmurhash": "^0.1.4",
- "signal-exit": "^3.0.2"
- }
- },
- "ws": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-4.0.0.tgz",
- "integrity": "sha512-QYslsH44bH8O7/W2815u5DpnCpXWpEK44FmaHffNwgJI4JMaSZONgPBTOfrxJ29mXKbXak+LsJ2uAkDTYq2ptQ==",
- "dev": true,
- "requires": {
- "async-limiter": "~1.0.0",
- "safe-buffer": "~5.1.0",
- "ultron": "~1.1.0"
- }
- },
- "xml-name-validator": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
- "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
- "dev": true
- },
- "xtend": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
- "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
- },
- "y18n": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
- "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
- "dev": true
- },
- "yallist": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
- "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
- },
- "yargs": {
- "version": "10.1.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz",
- "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==",
- "dev": true,
- "requires": {
- "cliui": "^4.0.0",
- "decamelize": "^1.1.1",
- "find-up": "^2.1.0",
- "get-caller-file": "^1.0.1",
- "os-locale": "^2.0.0",
- "require-directory": "^2.1.1",
- "require-main-filename": "^1.0.1",
- "set-blocking": "^2.0.0",
- "string-width": "^2.0.0",
- "which-module": "^2.0.0",
- "y18n": "^3.2.1",
- "yargs-parser": "^8.1.0"
- },
- "dependencies": {
- "cliui": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.0.0.tgz",
- "integrity": "sha512-nY3W5Gu2racvdDk//ELReY+dHjb9PlIcVDFXP72nVIhq2Gy3LuVXYwJoPVudwQnv1shtohpgkdCKT2YaKY0CKw==",
- "dev": true,
- "requires": {
- "string-width": "^2.1.1",
- "strip-ansi": "^4.0.0",
- "wrap-ansi": "^2.0.0"
- }
- }
- }
- },
- "yargs-parser": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz",
- "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==",
- "dev": true,
- "requires": {
- "camelcase": "^4.1.0"
- },
- "dependencies": {
- "camelcase": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
- "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
- "dev": true
- }
- }
- },
- "yeoman-assert": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yeoman-assert/-/yeoman-assert-3.1.1.tgz",
- "integrity": "sha512-bCuLb/j/WzpvrJZCTdJJLFzm7KK8IYQJ3+dF9dYtNs2CUYyezFJDuULiZ2neM4eqjf45GN1KH/MzCTT3i90wUQ==",
- "dev": true
- },
- "yeoman-environment": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-2.0.6.tgz",
- "integrity": "sha512-jzHBTTy8EPI4ImV8dpUMt+Q5zELkSU5xvGpndHcHudQ4tqN6YgIWaCGmRFl+HDchwRUkcgyjQ+n6/w5zlJBCPg==",
- "requires": {
- "chalk": "^2.1.0",
- "debug": "^3.1.0",
- "diff": "^3.3.1",
- "escape-string-regexp": "^1.0.2",
- "globby": "^6.1.0",
- "grouped-queue": "^0.3.3",
- "inquirer": "^3.3.0",
- "is-scoped": "^1.0.0",
- "lodash": "^4.17.4",
- "log-symbols": "^2.1.0",
- "mem-fs": "^1.1.0",
- "text-table": "^0.2.0",
- "untildify": "^3.0.2"
- }
- },
- "yeoman-generator": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/yeoman-generator/-/yeoman-generator-2.0.4.tgz",
- "integrity": "sha512-Sgvz3MAkOpEIobcpW3rjEl6bOTNnl8SkibP9z7hYKfIGIlw0QDC2k0MAeXvyE2pLqc2M0Duql+6R7/W9GrJojg==",
- "requires": {
- "async": "^2.6.0",
- "chalk": "^2.3.0",
- "cli-table": "^0.3.1",
- "cross-spawn": "^5.1.0",
- "dargs": "^5.1.0",
- "dateformat": "^3.0.2",
- "debug": "^3.1.0",
- "detect-conflict": "^1.0.0",
- "error": "^7.0.2",
- "find-up": "^2.1.0",
- "github-username": "^4.0.0",
- "istextorbinary": "^2.1.0",
- "lodash": "^4.17.4",
- "make-dir": "^1.1.0",
- "mem-fs-editor": "^3.0.2",
- "minimist": "^1.2.0",
- "pretty-bytes": "^4.0.2",
- "read-chunk": "^2.1.0",
- "read-pkg-up": "^3.0.0",
- "rimraf": "^2.6.2",
- "run-async": "^2.0.0",
- "shelljs": "^0.8.0",
- "text-table": "^0.2.0",
- "through2": "^2.0.0",
- "yeoman-environment": "^2.0.5"
- }
- },
- "yeoman-test": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/yeoman-test/-/yeoman-test-1.7.0.tgz",
- "integrity": "sha512-vJeg2gpWfhbq0HvQ7/yqmsQpYmADBfo9kaW+J6uJASkI7ChLBXNLIBQqaXCA65kWtHXOco+nBm0Km/O9YWk25Q==",
- "dev": true,
- "requires": {
- "inquirer": "^3.0.1",
- "lodash": "^4.3.0",
- "mkdirp": "^0.5.1",
- "pinkie-promise": "^2.0.1",
- "rimraf": "^2.4.4",
- "sinon": "^2.3.6",
- "yeoman-environment": "^2.0.0",
- "yeoman-generator": "^1.1.0"
- },
- "dependencies": {
- "ansi-escapes": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz",
- "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=",
- "dev": true
- },
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "dev": true
- },
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dev": true,
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "cli-cursor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz",
- "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=",
- "dev": true,
- "requires": {
- "restore-cursor": "^1.0.1"
- }
- },
- "dateformat": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz",
- "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=",
- "dev": true
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "diff": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/diff/-/diff-2.2.3.tgz",
- "integrity": "sha1-YOr9DSjukG5Oj/ClLBIpUhAzv5k=",
- "dev": true
- },
- "external-editor": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-1.1.1.tgz",
- "integrity": "sha1-Etew24UPf/fnCBuvQAVwAGDEYAs=",
- "dev": true,
- "requires": {
- "extend": "^3.0.0",
- "spawn-sync": "^1.0.15",
- "tmp": "^0.0.29"
- }
- },
- "figures": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
- "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
- "dev": true,
- "requires": {
- "escape-string-regexp": "^1.0.5",
- "object-assign": "^4.1.0"
- }
- },
- "gh-got": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/gh-got/-/gh-got-5.0.0.tgz",
- "integrity": "sha1-7pW+NxBv2HSKlvjR20uuqJ4b+oo=",
- "dev": true,
- "requires": {
- "got": "^6.2.0",
- "is-plain-obj": "^1.1.0"
- }
- },
- "github-username": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/github-username/-/github-username-3.0.0.tgz",
- "integrity": "sha1-CnciGbMTB0NCnyRW0L3T21Xc57E=",
- "dev": true,
- "requires": {
- "gh-got": "^5.0.0"
- }
- },
- "globby": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-4.1.0.tgz",
- "integrity": "sha1-CA9UVJ7BuCpsYOYx/ILhIR2+lfg=",
- "dev": true,
- "requires": {
- "array-union": "^1.0.1",
- "arrify": "^1.0.0",
- "glob": "^6.0.1",
- "object-assign": "^4.0.1",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- },
- "dependencies": {
- "glob": {
- "version": "6.0.4",
- "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
- "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=",
- "dev": true,
- "requires": {
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "2 || 3",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- }
- }
- },
- "got": {
- "version": "6.7.1",
- "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
- "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
- "dev": true,
- "requires": {
- "create-error-class": "^3.0.0",
- "duplexer3": "^0.1.4",
- "get-stream": "^3.0.0",
- "is-redirect": "^1.0.0",
- "is-retry-allowed": "^1.0.0",
- "is-stream": "^1.0.0",
- "lowercase-keys": "^1.0.0",
- "safe-buffer": "^5.0.1",
- "timed-out": "^4.0.0",
- "unzip-response": "^2.0.1",
- "url-parse-lax": "^1.0.0"
- }
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "dev": true,
- "requires": {
- "number-is-nan": "^1.0.0"
- }
- },
- "load-json-file": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
- "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "parse-json": "^2.2.0",
- "pify": "^2.0.0",
- "strip-bom": "^3.0.0"
- }
- },
- "log-symbols": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz",
- "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=",
- "dev": true,
- "requires": {
- "chalk": "^1.0.0"
- }
- },
- "mute-stream": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.6.tgz",
- "integrity": "sha1-SJYrGeFp/R38JAs/HnMXYnu8R9s=",
- "dev": true
- },
- "onetime": {
- "version": "1.1.0",
- "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
- "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
- "dev": true
- },
- "parse-json": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
- "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
- "dev": true,
- "requires": {
- "error-ex": "^1.2.0"
- }
- },
- "path-type": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
- "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
- "dev": true,
- "requires": {
- "pify": "^2.0.0"
- }
- },
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
- "dev": true
- },
- "read-pkg": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
- "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
- "dev": true,
- "requires": {
- "load-json-file": "^2.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^2.0.0"
- }
- },
- "read-pkg-up": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
- "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
- "dev": true,
- "requires": {
- "find-up": "^2.0.0",
- "read-pkg": "^2.0.0"
- }
- },
- "restore-cursor": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz",
- "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=",
- "dev": true,
- "requires": {
- "exit-hook": "^1.0.0",
- "onetime": "^1.0.0"
- }
- },
- "shelljs": {
- "version": "0.7.8",
- "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz",
- "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=",
- "dev": true,
- "requires": {
- "glob": "^7.0.0",
- "interpret": "^1.0.0",
- "rechoir": "^0.6.2"
- }
- },
- "string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "dev": true,
- "requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "dev": true,
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
- "dev": true
- },
- "tmp": {
- "version": "0.0.29",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz",
- "integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=",
- "dev": true,
- "requires": {
- "os-tmpdir": "~1.0.1"
- }
- },
- "untildify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/untildify/-/untildify-2.1.0.tgz",
- "integrity": "sha1-F+soB5h/dpUunASF/DEdBqgmouA=",
- "dev": true,
- "requires": {
- "os-homedir": "^1.0.0"
- }
- },
- "yeoman-generator": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/yeoman-generator/-/yeoman-generator-1.1.1.tgz",
- "integrity": "sha1-QMK09s374F4ZUv3XKTPw2JJdvfU=",
- "dev": true,
- "requires": {
- "async": "^2.0.0",
- "chalk": "^1.0.0",
- "class-extend": "^0.1.0",
- "cli-table": "^0.3.1",
- "cross-spawn": "^5.0.1",
- "dargs": "^5.1.0",
- "dateformat": "^2.0.0",
- "debug": "^2.1.0",
- "detect-conflict": "^1.0.0",
- "error": "^7.0.2",
- "find-up": "^2.1.0",
- "github-username": "^3.0.0",
- "glob": "^7.0.3",
- "istextorbinary": "^2.1.0",
- "lodash": "^4.11.1",
- "mem-fs-editor": "^3.0.0",
- "minimist": "^1.2.0",
- "mkdirp": "^0.5.0",
- "path-exists": "^3.0.0",
- "path-is-absolute": "^1.0.0",
- "pretty-bytes": "^4.0.2",
- "read-chunk": "^2.0.0",
- "read-pkg-up": "^2.0.0",
- "rimraf": "^2.2.0",
- "run-async": "^2.0.0",
- "shelljs": "^0.7.0",
- "text-table": "^0.2.0",
- "through2": "^2.0.0",
- "user-home": "^2.0.0",
- "yeoman-environment": "^1.1.0"
- },
- "dependencies": {
- "inquirer": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-1.2.3.tgz",
- "integrity": "sha1-TexvMvN+97sLLtPx0aXD9UUHSRg=",
- "dev": true,
- "requires": {
- "ansi-escapes": "^1.1.0",
- "chalk": "^1.0.0",
- "cli-cursor": "^1.0.1",
- "cli-width": "^2.0.0",
- "external-editor": "^1.1.0",
- "figures": "^1.3.5",
- "lodash": "^4.3.0",
- "mute-stream": "0.0.6",
- "pinkie-promise": "^2.0.0",
- "run-async": "^2.2.0",
- "rx": "^4.1.0",
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.0",
- "through": "^2.3.6"
- }
- },
- "yeoman-environment": {
- "version": "1.6.6",
- "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-1.6.6.tgz",
- "integrity": "sha1-zYX6Z9FWBg5EDXgH1+988NLR1nE=",
- "dev": true,
- "requires": {
- "chalk": "^1.0.0",
- "debug": "^2.0.0",
- "diff": "^2.1.2",
- "escape-string-regexp": "^1.0.2",
- "globby": "^4.0.0",
- "grouped-queue": "^0.3.0",
- "inquirer": "^1.0.2",
- "lodash": "^4.11.1",
- "log-symbols": "^1.0.1",
- "mem-fs": "^1.1.0",
- "text-table": "^0.2.0",
- "untildify": "^2.0.0"
- }
- }
- }
- }
- }
- },
- "yosay": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/yosay/-/yosay-2.0.2.tgz",
- "integrity": "sha512-avX6nz2esp7IMXGag4gu6OyQBsMh/SEn+ZybGu3yKPlOTE6z9qJrzG/0X5vCq/e0rPFy0CUYCze0G5hL310ibA==",
- "requires": {
- "ansi-regex": "^2.0.0",
- "ansi-styles": "^3.0.0",
- "chalk": "^1.0.0",
- "cli-boxes": "^1.0.0",
- "pad-component": "0.0.1",
- "string-width": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "taketalk": "^1.0.0",
- "wrap-ansi": "^2.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
- }
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
- }
- }
- }
- }
-}
diff --git a/Generator/generator-botbuilder-java/package.json b/Generator/generator-botbuilder-java/package.json
deleted file mode 100644
index 82a38d3f9..000000000
--- a/Generator/generator-botbuilder-java/package.json
+++ /dev/null
@@ -1,87 +0,0 @@
-{
- "name": "generator-botbuilder-java",
- "version": "0.0.0",
- "description": "Template to create conversational bots in Java using Microsoft Bot Framework.",
- "homepage": "https://github.com/Microsoft/botbuilder-java",
- "author": {
- "name": "Microsoft",
- "email": "",
- "url": ""
- },
- "files": [
- "generators"
- ],
- "main": "generators/index.js",
- "keywords": [
- "bot",
- "bots",
- "chatbots",
- "bot framework",
- "yeoman-generator"
- ],
- "devDependencies": {
- "yeoman-test": "^1.7.0",
- "yeoman-assert": "^3.1.0",
- "coveralls": "^3.0.0",
- "nsp": "^2.8.0",
- "eslint": "^4.19.1",
- "prettier": "^1.11.1",
- "husky": "^0.14.3",
- "lint-staged": "^6.1.1",
- "eslint-config-prettier": "^2.9.0",
- "eslint-plugin-prettier": "^2.6.0",
- "eslint-config-xo": "^0.20.1",
- "jest": "^22.0.6"
- },
- "engines": {
- "npm": ">= 4.0.0"
- },
- "dependencies": {
- "yeoman-generator": "^2.0.1",
- "chalk": "^2.1.0",
- "yosay": "^2.0.1"
- },
- "jest": {
- "testEnvironment": "node"
- },
- "scripts": {
- "prepublishOnly": "nsp check",
- "pretest": "eslint .",
- "precommit": "lint-staged",
- "test": "jest"
- },
- "lint-staged": {
- "*.js": [
- "eslint --fix",
- "git add"
- ],
- "*.json": [
- "prettier --write",
- "git add"
- ]
- },
- "eslintConfig": {
- "extends": [
- "xo",
- "prettier"
- ],
- "env": {
- "jest": true,
- "node": true
- },
- "rules": {
- "prettier/prettier": [
- "error",
- {
- "singleQuote": true,
- "printWidth": 90
- }
- ]
- },
- "plugins": [
- "prettier"
- ]
- },
- "repository": "https://github.com/Microsoft/botbuilder-java.git",
- "license": "MIT"
-}
diff --git a/README.md b/README.md
index 842e07bac..7c90ffb18 100644
--- a/README.md
+++ b/README.md
@@ -1,39 +1,129 @@
+# 
-# Bot Builder SDK v4 (Java) (Preview)
+**The Bot Framework Java SDK is being retired with final long-term support ending in November 2023, after which this repository will be archived. There will be no further feature development, with only critical security and bug fixes within this repository being undertaken. Existing bots built with this SDK will continue to function. For all new bot development we recommend that you adopt [Power Virtual Agents](https://powervirtualagents.microsoft.com/en-us/blog/the-future-of-bot-building/) or use the [Bot Framework C#](https://github.com/microsoft/botbuilder-dotnet) or [Bot Framework JavaScript](https://github.com/microsoft/botbuilder-js) SDKs.**
-[](https://travis-ci.org/Microsoft/botbuilder-java)
-[](https://github.com/Microsoft/botbuilder-java/wiki/Roadmap)
+This repository contains code for the Java version of the [Microsoft Bot Framework SDK](https://github.com/Microsoft/botframework-sdk), which is part of the Microsoft Bot Framework - a comprehensive framework for building enterprise-grade conversational AI experiences.
-This repository contains code for the Java version of the [Microsoft Bot Builder V4 SDK](https://docs.microsoft.com/en-us/azure/bot-service/?view=azure-bot-service-4.0). The Bot Builder SDK v4 is the latest SDK for building bot applications. It is in **Preview** state and is being actively developed.
-Production bots should continue to be developed using C# or Javascript with the [v3 SDK](https://github.com/Microsoft/BotBuilder/tree/master/CSharp). In addition to the Java Bot Builder V4 SDK, Bot Builder supports creating bots in other popular programming languages like [.Net SDK](https://github.com/Microsoft/botbuilder-dotnet), [JavaScript](https://github.com/Microsoft/botbuilder-js), and [Python](https://github.com/Microsoft/botbuilder-python).
+This SDK enables developers to model conversation and build sophisticated bot applications using Java. SDKs for [.NET](https://github.com/Microsoft/botbuilder-dotnet), [Python](https://github.com/Microsoft/botbuilder-python) and [JavaScript](https://github.com/Microsoft/botbuilder-js) are also available.
-To get started see the [Azure Bot Service Documentation](https://docs.microsoft.com/en-us/azure/bot-service/?view=azure-bot-service-4.0) for the v4 SDK.
+To get started building bots using the SDK, see the [Azure Bot Service Documentation](https://docs.microsoft.com/en-us/azure/bot-service/?view=azure-bot-service-4.0). If you are an existing user, then you can also [find out what's new with Bot Framework](https://docs.microsoft.com/en-us/azure/bot-service/what-is-new?view=azure-bot-service-4.0).
-## Contributing
+For more information jump to a section below.
-This project welcomes contributions and suggestions. Most contributions require you to agree to a
-Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us
-the rights to use your contribution. For details, visit https://cla.microsoft.com.
+- [Bot Framework for Java](#)
+ - [Build Status](#build-status)
+ - [Getting Started](#getting-started)
+ - [Prerequisites](#prerequisites)
+ - [Clone](#clone)
+ - [Build and test locally](#build-and-test-locally)
+ - [Linting rules](#linting-rules)
+ - [Getting support and providing feedback](#getting-support-and-providing-feedback)
+ - [Github issues](#github-issues)
+ - [Stack overflow](#stack-overflow)
+ - [Azure Support](#azure-support)
+ - [Twitter](#twitter)
+ - [Gitter Chat Room](#gitter-chat-room)
+ - [Contributing and our code of conduct](#contributing-and-our-code-of-conduct)
+ - [Reporting Security Issues](#reporting-security-issues)
-When you submit a pull request, a CLA-bot will automatically determine whether you need to provide
-a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions
-provided by the bot. You will only need to do this once across all repos using our CLA.
+## Build Status
+
+ | Branch | Description | Build Status | Coverage Status |
+ |--------|-------------|--------------|-----------------|
+ |Main | 4.15.* Builds | [](https://fuselabs.visualstudio.com/SDK_v4/_build/latest?definitionId=1202&branchName=main) | [](https://coveralls.io/github/microsoft/botbuilder-java?branch=823847c676b7dbb0fa348a308297ae375f5141ef) |
+
+## Getting Started
+To get started building bots using the SDK, see the [Azure Bot Service Documentation](https://docs.microsoft.com/en-us/azure/bot-service/?view=azure-bot-service-4.0).
+
+The [Bot Framework Samples](https://github.com/microsoft/botbuilder-samples) includes a rich set of samples repository.
+
+If you want to debug an issue, would like to [contribute](#contributing), or understand how the Bot Builder SDK works, instructions for building and testing the SDK are below.
+
+### Prerequisites
+- [Git](https://git-scm.com/downloads)
+- [Java](https://www.azul.com/downloads/zulu/)
+- [Maven](https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html)
+
+### Clone
+Clone a copy of the repo:
+```bash
+git clone https://github.com/Microsoft/botbuilder-java.git
+```
+Change to the SDK's directory:
+```bash
+cd botbuilder-java
+```
+
+Now at the command prompt type:
+```bash
+mvn clean install
+```
+
+### Build and test locally
+Any IDE that can import and work with Maven projects should work. As a matter of practice we use the command line to perform Maven builds. If your IDE can be configured to defer build and run to Maven it should also work.
+- Java
+ - We use the [Azul JDK 8](https://www.azul.com/downloads/azure-only/zulu/?version=java-8-lts&architecture=x86-64-bit&package=jdk) to build and test with. While not a requirement to develop the SDK with, it is recommended as this is what Azure is using for Java 1.8. If you do install this JDK, make sure your IDE is targeting that JVM, and your path (from command line) and JAVA_HOME point to that.
+
+- Visual Studio Code
+ - Extensions
+ - Java Extension Pack by Microsoft
+ - EditorConfig for VS Code by EditorConfig (Recommended)
+
+- IntelliJ
+ - Extensions
+ - Checkstyle by IDEA
+ - Recommended setup
+ - When importing the SDK for the first time, make sure "Auto import" is checked.
+
+### Linting rules
+
+This project uses linting rules to enforce code standardization. These rules are specified in the file [bot-checkstyle.xml](./etc/bot-checkstyle.xml) with [CheckStyle](https://checkstyle.org/) and are hooked to Maven's build cycle.
+
+**INFO**: Since the CheckStyle and PMD plugins are hooked into the build cycle, this makes the build **fail** in cases where there are linting warnings in the project files. Errors will be in the file ./target/checkstyle-result.xml and ./target/pmd.xml.
+
+CheckStyle is available in different flavours:
+- [Visual Studio Code plugin](https://marketplace.visualstudio.com/items?itemName=shengchen.vscode-checkstyle)
+- [IntelliJ IDEA plugin](https://plugins.jetbrains.com/plugin/1065-checkstyle-idea)
+- [Eclipse plugin](https://checkstyle.org/eclipse-cs)
+- [CLI Tool](https://checkstyle.org/cmdline.html)
+
+**INFO**: Be sure to configure your IDE to use the file [bot-checkstyle.xml](./etc/bot-checkstyle.xml) instead of the default rules.
+
+## Getting support and providing feedback
+Below are the various channels that are available to you for obtaining support and providing feedback. Please pay carful attention to which channel should be used for which type of content. e.g. general "how do I..." questions should be asked on Stack Overflow, Twitter or Gitter, with GitHub issues being for feature requests and bug reports.
+
+### Github issues
+[Github issues](https://github.com/Microsoft/botbuilder-python/issues) should be used for bugs and feature requests.
+
+### Stack overflow
+[Stack Overflow](https://stackoverflow.com/questions/tagged/botframework) is a great place for getting high-quality answers. Our support team, as well as many of our community members are already on Stack Overflow providing answers to 'how-to' questions.
+
+### Azure Support
+If you issues relates to [Azure Bot Service](https://azure.microsoft.com/en-gb/services/bot-service/), you can take advantage of the available [Azure support options](https://azure.microsoft.com/en-us/support/options/).
+
+### Twitter
+We use the [@botframework](https://twitter.com/botframework) account on twitter for announcements and members from the development team watch for tweets for @botframework.
+
+### Gitter Chat Room
+The [Gitter Channel](https://gitter.im/Microsoft/BotBuilder) provides a place where the Community can get together and collaborate.
+
+## Contributing and our code of conduct
+We welcome contributions and suggestions. Please see our [contributing guidelines](./Contributing.md) for more information.
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).
-For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or
-contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
+For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact
+ [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
## Reporting Security Issues
+Security issues and bugs should be reported privately, via email, to the Microsoft Security Response Center (MSRC)
+at [secure@microsoft.com](mailto:secure@microsoft.com). You should receive a response within 24 hours. If for some
+ reason you do not, please follow up via email to ensure we received your original message. Further information,
+ including the [MSRC PGP](https://technet.microsoft.com/en-us/security/dn606155) key, can be found in the
+[Security TechCenter](https://technet.microsoft.com/en-us/security/default).
-Security issues and bugs should be reported privately, via email, to the Microsoft Security
-Response Center (MSRC) at [secure@microsoft.com](mailto:secure@microsoft.com). You should
-receive a response within 24 hours. If for some reason you do not, please follow up via
-email to ensure we received your original message. Further information, including the
-[MSRC PGP](https://technet.microsoft.com/en-us/security/dn606155) key, can be found in
-the [Security TechCenter](https://technet.microsoft.com/en-us/security/default).
+Copyright (c) Microsoft Corporation. All rights reserved.
+
+Licensed under the [MIT](./LICENSE.md) License.
-## License
-Copyright (c) Microsoft Corporation. All rights reserved.
-Licensed under the [MIT](https://github.com/Microsoft/vscode/blob/master/LICENSE.txt) License.
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 000000000..e138ec5d6
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,41 @@
+
+
+## Security
+
+Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/).
+
+If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below.
+
+## Reporting Security Issues
+
+**Please do not report security vulnerabilities through public GitHub issues.**
+
+Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report).
+
+If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey).
+
+You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc).
+
+Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:
+
+ * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)
+ * Full paths of source file(s) related to the manifestation of the issue
+ * The location of the affected source code (tag/branch/commit or direct URL)
+ * Any special configuration required to reproduce the issue
+ * Step-by-step instructions to reproduce the issue
+ * Proof-of-concept or exploit code (if possible)
+ * Impact of the issue, including how an attacker might exploit the issue
+
+This information will help us triage your report more quickly.
+
+If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs.
+
+## Preferred Languages
+
+We prefer all communications to be in English.
+
+## Policy
+
+Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd).
+
+
diff --git a/STATUS.md b/STATUS.md
new file mode 100644
index 000000000..88e0b4c9a
--- /dev/null
+++ b/STATUS.md
@@ -0,0 +1,70 @@
+# Java Bot Framework
+
+The current release is **Preview 8**.
+
+## Core Packages
+
+| Package | Status
+| :------------- |:-------------
+| bot-schema | Preview 2
+| bot-connector | Preview 2
+| bot-integration-core | Preview 2
+| bot-builder | Preview 3
+| bot-builder-teams | Preview 5
+| bot-schema-teams | Preview 5
+| bot-connector-teams | Preview 5
+| bot-dialog | Preview 8
+| bot-dialog-adaptive | TBD
+| bot-dialog-declarative | TBD
+| bot-streaming-extensions | TBD
+| bot-ai-luis-v3 | Preview 8
+| bot-ai-qna | In Progress
+| bot-applicationinsights | Not Started
+| bot-azure | In Progress
+
+## Samples
+| Package | Status
+| ------------- |:-------------
+| 02.echo-bot | Preview 3
+| 03.welcome-user | Preview 3
+| 05.multi-turn-prompt | Preview 8
+| 06.using-cards | Preview 8
+| 07.using-adaptive-cards |
+| 08.suggested-actions | Preview 3
+| 11.qnamaker |
+| 13.core-bot |
+| 14.nlp-with-dispatch |
+| 15.handling-attachments |
+| 16.proactive-messages | Preview 3
+| 17.multilingual-bot | Preview 8
+| 18.bot-authentication | Preview 8
+| 19.custom-dialogs | Preview 8
+| 21.corebot-app-insights |
+| 23.facebook-events |
+| 24.bot-authentication-msgraph | Preview 8
+| 40.timex-resolution |
+| 42.scaleout |
+| 43.complex-dialog | Preview 8
+| 44.prompt-users-for-input | Preview 8
+| 45.state-management | Preview 3
+| 46.teams-auth | Preview 8
+| 47.inspection | Preview 3
+| 48.qnamaker-active-learning-bot |
+| 49.qnamaker-all-features |
+| 50.teams-messaging-extensions-search | Preview 5
+| 51.teams-messaging-extensions-action | Preview 5
+| 52.teams-messaging-extensions-search-auth-config | Preview 5
+| 53.teams-messaging-extensions-action-preview | Preview 5
+| 54.teams-task-module | Preview 5
+| 55.teams-link-unfurling | Preview 5
+| 56.teams-file-upload | Preview 5
+| 57.teams-conversation-bot | Preview 5
+| 58.teams-start-new-thread-in-channel | Preview 5
+| servlet-echo | Preview 2
+
+## Build Prerequisites
+
+- [Java 1.8](https://docs.microsoft.com/en-us/azure/java/jdk/java-jdk-install)
+ - Should be able to execute `java -version` from command line.
+- [Maven](https://maven.apache.org/install.html)
+ - Should be able to execute `mvn -version` from command line.
diff --git a/docs/media/BotFrameworkJava_header.png b/docs/media/BotFrameworkJava_header.png
new file mode 100644
index 000000000..4feb13007
Binary files /dev/null and b/docs/media/BotFrameworkJava_header.png differ
diff --git a/etc/bot-checkstyle.xml b/etc/bot-checkstyle.xml
new file mode 100644
index 000000000..a379f3c79
--- /dev/null
+++ b/etc/bot-checkstyle.xml
@@ -0,0 +1,195 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/etc/botframework-java-formatter.xml b/etc/botframework-java-formatter.xml
new file mode 100644
index 000000000..349eea9a8
--- /dev/null
+++ b/etc/botframework-java-formatter.xml
@@ -0,0 +1,365 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Generator/generator-botbuilder-java/.gitignore b/generators/.gitignore
similarity index 100%
rename from Generator/generator-botbuilder-java/.gitignore
rename to generators/.gitignore
diff --git a/generators/LICENSE.md b/generators/LICENSE.md
new file mode 100644
index 000000000..506ab97e5
--- /dev/null
+++ b/generators/LICENSE.md
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 Microsoft Corporation
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION 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/generators/README.md b/generators/README.md
new file mode 100644
index 000000000..c86d8685f
--- /dev/null
+++ b/generators/README.md
@@ -0,0 +1,126 @@
+# generator-botbuilder-java
+
+Yeoman generator for [Bot Framework v4](https://dev.botframework.com). Will let you quickly set up a conversational AI bot
+using core AI capabilities.
+
+## About
+
+`generator-botbuilder-java` will help you build new conversational AI bots using the [Bot Framework v4](https://dev.botframework.com).
+
+## Templates
+
+The generator supports three different template options. The table below can help guide which template is right for you.
+
+| Template | Description |
+| ---------- | --------- |
+| Echo Bot | A good template if you want a little more than "Hello World!", but not much more. This template handles the very basics of sending messages to a bot, and having the bot process the messages by repeating them back to the user. This template produces a bot that simply "echoes" back to the user anything the user says to the bot. |
+| Empty Bot | A good template if you are familiar with Bot Framework v4, and simply want a basic skeleton project. Also a good option if you want to take sample code from the documentation and paste it into a minimal bot in order to learn. |
+| Core Bot | A good template if you want to create advanced bots, as it uses multi-turn dialogs and [LUIS](https://www.luis.ai), an AI based cognitive service, to implement language understanding. This template creates a bot that can extract places and dates to book a flight. |
+
+### How to Choose a Template
+
+| Template | When This Template is a Good Choice |
+| -------- | -------- |
+| Echo Bot | You are new to Bot Framework v4 and want a working bot with minimal features. |
+| Empty Bot | You are a seasoned Bot Framework v4 developer. You've built bots before, and want the minimum skeleton of a bot. |
+| Core Bot | You are a medium to advanced user of Bot Framework v4 and want to start integrating language understanding as well as multi-turn dialogs in your bots. |
+
+### Template Overview
+
+#### Echo Bot Template
+
+The Echo Bot template is slightly more than the a classic "Hello World!" example, but not by much. This template shows the basic structure of a bot, how a bot receives messages from a user, and how a bot sends messages to a user. The bot will "echo" back to the user, what the user says to the bot. It is a good choice for first time, new to Bot Framework v4 developers.
+
+#### Empty Bot Template
+
+The Empty Bot template is the minimal skeleton code for a bot. It provides a stub `onTurn` handler but does not perform any actions. If you are experienced writing bots with Bot Framework v4 and want the minimum scaffolding, the Empty template is for you.
+
+#### Core Bot Template
+
+The Core Bot template uses [LUIS](https://www.luis.ai) to implement core AI capabilities, a multi-turn conversation using Dialogs, handles user interruptions, and prompts for and validate requests for information from the user. This template implements a basic three-step waterfall dialog, where the first step asks the user for an input to book a flight, then asks the user if the information is correct, and finally confirms the booking with the user. Choose this template if want to create an advanced bot that can extract information from the user's input.
+
+## Installation
+
+1. Install [Yeoman](http://yeoman.io) using [npm](https://www.npmjs.com) (we assume you have pre-installed [node.js](https://nodejs.org/)).
+
+ ```bash
+ # Make sure both are installed globally
+ npm install -g yo
+ ```
+
+2. Install generator-botbuilder-java by typing the following in your console:
+
+ ```bash
+ # Make sure both are installed globally
+ npm install -g generator-botbuilder-java
+ ```
+
+3. Verify that Yeoman and generator-botbuilder-java have been installed correctly by typing the following into your console:
+
+ ```bash
+ yo botbuilder-java --help
+ ```
+
+## Usage
+
+### Creating a New Bot Project
+
+When the generator is launched, it will prompt for the information required to create a new bot.
+
+```bash
+# Run the generator in interactive mode
+yo botbuilder-java
+```
+
+### Generator Command Line Options
+
+The generator supports a number of command line options that can be used to change the generator's default options or to pre-seed a prompt.
+
+| Command line Option | Description |
+| ------------------- | ----------- |
+| --help, -h | List help text for all supported command-line options |
+| --botName, -N | The name given to the bot project |
+| --packageName, -P | The Java package name to use for the bot |
+| --template, -T | The template used to generate the project. Options are `empty`, or `echo`. See [https://aka.ms/botbuilder-generator](https://aka.ms/botbuilder-generator) for additional information regarding the different template option and their functional differences. |
+| --noprompt | The generator will not prompt for confirmation before creating a new bot. Any requirement options not passed on the command line will use a reasonable default value. This option is intended to enable automated bot generation for testing purposes. |
+
+#### Example Using Command Line Options
+
+This example shows how to pass command line options to the generator, setting the default language to TypeScript and the default template to Core.
+
+```bash
+# Run the generator defaulting the pacakge name and the template
+yo botbuilder-java --P "com.mycompany.bot" --T "echo"
+```
+
+### Generating a Bot Using --noprompt
+
+The generator can be run in `--noprompt` mode, which can be used for automated bot creation. When run in `--noprompt` mode, the generator can be configured using command line options as documented above. If a command line option is ommitted a reasonable default will be used. In addition, passing the `--noprompt` option will cause the generator to create a new bot project without prompting for confirmation before generating the bot.
+
+#### Default Options
+
+| Command line Option | Default Value |
+| ------------------- | ----------- |
+| --botname, -N | `echo` |
+| --packageName, -p | `echo` |
+| --template, -T | `echo` |
+
+#### Examples Using --noprompt
+
+This example shows how to run the generator in --noprompt mode, setting all required options on the command line.
+
+```bash
+# Run the generator, setting all command line options
+yo botbuilder-java --noprompt -N "MyEchoBot" -P "com.mycompany.bot.echo" -T "echo"
+```
+
+This example shows how to run the generator in --noprompt mode, using all the default command line options. The generator will create a bot project using all the default values specified in the **Default Options** table above.
+
+```bash
+# Run the generator using all default options
+yo botbuilder-java --noprompt
+```
+
+## Logging Issues and Providing Feedback
+
+Issues and feedback about the botbuilder generator can be submitted through the project's [GitHub Issues](https://github.com/Microsoft/botbuilder-java/issues) page.
diff --git a/generators/generators/app/index.js b/generators/generators/app/index.js
new file mode 100644
index 000000000..13df547aa
--- /dev/null
+++ b/generators/generators/app/index.js
@@ -0,0 +1,276 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+'use strict';
+const pkg = require('../../package.json');
+const Generator = require('yeoman-generator');
+const path = require('path');
+const chalk = require('chalk');
+const mkdirp = require('mkdirp');
+const _ = require('lodash');
+
+const BOT_TEMPLATE_NAME_EMPTY = 'Empty Bot';
+const BOT_TEMPLATE_NAME_SIMPLE = 'Echo Bot';
+const BOT_TEMPLATE_NAME_CORE = 'Core Bot';
+
+const BOT_TEMPLATE_NOPROMPT_EMPTY = 'empty';
+const BOT_TEMPLATE_NOPROMPT_SIMPLE = 'echo';
+const BOT_TEMPLATE_NOPROMPT_CORE = 'core';
+
+const bigBot =
+ ` ╭─────────────────────────────╮\n` +
+ ` ` +
+ chalk.blue.bold(`//`) +
+ ` ` +
+ chalk.blue.bold(`\\\\`) +
+ ` │ Welcome to the │\n` +
+ ` ` +
+ chalk.blue.bold(`//`) +
+ ` () () ` +
+ chalk.blue.bold(`\\\\`) +
+ ` │ Microsoft Java Bot Builder │\n` +
+ ` ` +
+ chalk.blue.bold(`\\\\`) +
+ ` ` +
+ chalk.blue.bold(`//`) +
+ ` /│ generator! │\n` +
+ ` ` +
+ chalk.blue.bold(`\\\\`) +
+ ` ` +
+ chalk.blue.bold(`//`) +
+ ` ╰─────────────────────────────╯\n` +
+ ` v${pkg.version}`;
+
+const tinyBot =
+ ` ` + chalk.blue.bold(`<`) + ` ** ` + chalk.blue.bold(`>`) + ` `;
+
+module.exports = class extends Generator {
+ constructor(args, opts) {
+ super(args, opts);
+
+ // allocate an object that we can use to store our user prompt values from our askFor* functions
+ this.templateConfig = {};
+
+ // configure the commandline options
+ this._configureCommandlineOptions();
+ }
+
+ initializing() {
+ // give the user some data before we start asking them questions
+ this.log(bigBot);
+ }
+
+ prompting() {
+ // if we're told to not prompt, then pick what we need and return
+ if (this.options.noprompt) {
+ // this function will throw if it encounters errors/invalid options
+ return this._verifyNoPromptOptions();
+ }
+
+ const userPrompts = this._getPrompts();
+ async function executePrompts([prompt, ...rest]) {
+ if (prompt) {
+ await prompt();
+ return executePrompts(rest);
+ }
+ }
+
+ return executePrompts(userPrompts);
+ }
+
+ writing() {
+ // if the user confirmed their settings, then lets go ahead
+ // an install module dependencies
+ if (this.templateConfig.finalConfirmation === true) {
+ const botName = this.templateConfig.botName;
+ const packageName = this.templateConfig.packageName.replace(/-/g, '_').toLowerCase();
+ const packageTree = packageName.replace(/\./g, '/');
+ const artifact = _.kebabCase(this.templateConfig.botName).replace(/([^a-z0-9-]+)/gi, ``);
+ const directoryName = _.camelCase(this.templateConfig.botName);
+ const template = this.templateConfig.template.toLowerCase();
+
+ if (path.basename(this.destinationPath()) !== directoryName) {
+ mkdirp.sync(directoryName);
+ this.destinationRoot(this.destinationPath(directoryName));
+ }
+
+ // Copy the project tree
+ this.fs.copyTpl(
+ this.templatePath(path.join(template, 'project', '**')),
+ this.destinationPath(),
+ {
+ botName,
+ packageName,
+ artifact
+ }
+ );
+
+ // Copy main source
+ this.fs.copyTpl(
+ this.templatePath(path.join(template, 'src/main/java/**')),
+ this.destinationPath(path.join('src/main/java', packageTree)),
+ {
+ packageName
+ }
+ );
+
+ // Copy test source
+ this.fs.copyTpl(
+ this.templatePath(path.join(template, 'src/test/java/**')),
+ this.destinationPath(path.join('src/test/java', packageTree)),
+ {
+ packageName
+ }
+ );
+ }
+ }
+
+ end() {
+ if (this.templateConfig.finalConfirmation === true) {
+ this.log(chalk.green('------------------------ '));
+ this.log(chalk.green(' Your new bot is ready! '));
+ this.log(chalk.green('------------------------ '));
+ this.log(`Your bot should be in a directory named "${_.camelCase(this.templateConfig.botName)}"`);
+ this.log('Open the ' + chalk.green.bold('README.md') + ' to learn how to run your bot. ');
+ this.log('Thank you for using the Microsoft Bot Framework. ');
+ this.log(`\n${tinyBot} The Bot Framework Team`);
+ } else {
+ this.log(chalk.red.bold('-------------------------------- '));
+ this.log(chalk.red.bold(' New bot creation was canceled. '));
+ this.log(chalk.red.bold('-------------------------------- '));
+ this.log('Thank you for using the Microsoft Bot Framework. ');
+ this.log(`\n${tinyBot} The Bot Framework Team`);
+ }
+ }
+
+ _configureCommandlineOptions() {
+ this.option('botName', {
+ desc: 'The name you want to give to your bot',
+ type: String,
+ default: 'echo',
+ alias: 'N'
+ });
+
+ this.option('packageName', {
+ desc: `What's the fully qualified package name of your bot?`,
+ type: String,
+ default: 'com.mycompany.echo',
+ alias: 'P'
+ });
+
+ const templateDesc = `The initial bot capabilities. (${BOT_TEMPLATE_NAME_EMPTY} | ${BOT_TEMPLATE_NAME_SIMPLE} | ${BOT_TEMPLATE_NAME_CORE})`;
+ this.option('template', {
+ desc: templateDesc,
+ type: String,
+ default: BOT_TEMPLATE_NAME_SIMPLE,
+ alias: 'T'
+ });
+
+ this.argument('noprompt', {
+ desc: 'Do not prompt for any information or confirmation',
+ type: Boolean,
+ required: false,
+ default: false
+ });
+ }
+
+ _getPrompts() {
+ return [
+ // ask the user to name their bot
+ async () => {
+ return this.prompt({
+ type: 'input',
+ name: 'botName',
+ message: `What's the name of your bot?`,
+ default: (this.options.botName ? this.options.botName : 'echo')
+ }).then(answer => {
+ // store the botname description answer
+ this.templateConfig.botName = answer.botName;
+ });
+ },
+
+ // ask for package name
+ async () => {
+ return this.prompt({
+ type: 'input',
+ name: 'packageName',
+ message: `What's the fully qualified package name of your bot?`,
+ default: (this.options.packageName ? this.options.packageName : 'com.mycompany.echo')
+ }).then(answer => {
+ // store the package name description answer
+ this.templateConfig.packageName = answer.packageName;
+ });
+ },
+
+
+ // ask the user which bot template we should use
+ async () => {
+ return this.prompt({
+ type: 'list',
+ name: 'template',
+ message: 'Which template would you like to start with?',
+ choices: [
+ {
+ name: BOT_TEMPLATE_NAME_SIMPLE,
+ value: BOT_TEMPLATE_NOPROMPT_SIMPLE
+ },
+ {
+ name: BOT_TEMPLATE_NAME_EMPTY,
+ value: BOT_TEMPLATE_NOPROMPT_EMPTY
+ },
+ {
+ name: BOT_TEMPLATE_NAME_CORE,
+ value: BOT_TEMPLATE_NOPROMPT_CORE
+ }
+ ],
+ default: (this.options.template ? _.toLower(this.options.template) : BOT_TEMPLATE_NOPROMPT_SIMPLE)
+ }).then(answer => {
+ // store the template prompt answer
+ this.templateConfig.template = answer.template;
+ });
+ },
+
+ // ask the user for final confirmation before we generate their bot
+ async () => {
+ return this.prompt({
+ type: 'confirm',
+ name: 'finalConfirmation',
+ message: 'Looking good. Shall I go ahead and create your new bot?',
+ default: true
+ }).then(answer => {
+ // store the finalConfirmation prompt answer
+ this.templateConfig.finalConfirmation = answer.finalConfirmation;
+ });
+ }
+ ];
+ }
+
+ // if we're run with the --noprompt option, verify that all required options were supplied.
+ // throw for missing options, or a resolved Promise
+ _verifyNoPromptOptions() {
+ this.templateConfig = _.pick(this.options, ['botName', 'packageName', 'template'])
+
+ // validate we have what we need, or we'll need to throw
+ if (!this.templateConfig.botName) {
+ throw new Error('Must specify a name for your bot when using --noprompt argument. Use --botName or -N');
+ }
+ if (!this.templateConfig.packageName) {
+ throw new Error('Must specify a package name for your bot when using --noprompt argument. Use --packageName or -P');
+ }
+
+ // make sure we have a supported template
+ const template = (this.templateConfig.template ? _.toLower(this.templateConfig.template) : undefined);
+ const tmplEmpty = _.toLower(BOT_TEMPLATE_NOPROMPT_EMPTY);
+ const tmplSimple = _.toLower(BOT_TEMPLATE_NOPROMPT_SIMPLE);
+ const tmplCore = _.toLower(BOT_TEMPLATE_NOPROMPT_CORE);
+ if (!template || (template !== tmplEmpty && template !== tmplSimple && template !== tmplCore)) {
+ throw new Error('Must specify a template when using --noprompt argument. Use --template or -T');
+ }
+
+ // when run using --noprompt and we have all the required templateConfig, then set final confirmation to true
+ // so we can go forward and create the new bot without prompting the user for confirmation
+ this.templateConfig.finalConfirmation = true;
+
+ return Promise.resolve();
+ }
+};
diff --git a/generators/generators/app/templates/core/project/README-LUIS.md b/generators/generators/app/templates/core/project/README-LUIS.md
new file mode 100644
index 000000000..12bc78ed0
--- /dev/null
+++ b/generators/generators/app/templates/core/project/README-LUIS.md
@@ -0,0 +1,216 @@
+# Setting up LUIS via CLI:
+
+This README contains information on how to create and deploy a LUIS application. When the bot is ready to be deployed to production, we recommend creating a LUIS Endpoint Resource for usage with your LUIS App.
+
+> _For instructions on how to create a LUIS Application via the LUIS portal, see these Quickstart steps:_
+> 1. _[Quickstart: Create a new app in the LUIS portal][Quickstart-create]_
+> 2. _[Quickstart: Deploy an app in the LUIS portal][Quickstart-deploy]_
+
+ [Quickstart-create]: https://docs.microsoft.com/azure/cognitive-services/luis/get-started-portal-build-app
+ [Quickstart-deploy]:https://docs.microsoft.com/azure/cognitive-services/luis/get-started-portal-deploy-app
+
+## Table of Contents:
+
+- [Prerequisites](#Prerequisites)
+- [Import a new LUIS Application using a local LUIS application](#Import-a-new-LUIS-Application-using-a-local-LUIS-application)
+- [How to create a LUIS Endpoint resource in Azure and pair it with a LUIS Application](#How-to-create-a-LUIS-Endpoint-resource-in-Azure-and-pair-it-with-a-LUIS-Application)
+
+___
+
+## [Prerequisites](#Table-of-Contents):
+
+#### Install Azure CLI >=2.0.61:
+
+Visit the following page to find the correct installer for your OS:
+- https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest
+
+#### Install LUIS CLI >=2.4.0:
+
+Open a CLI of your choice and type the following:
+
+```bash
+npm i -g luis-apis@^2.4.0
+```
+
+#### LUIS portal account:
+
+You should already have a LUIS account with either https://luis.ai, https://eu.luis.ai, or https://au.luis.ai. To determine where to create a LUIS account, consider where you will deploy your LUIS applications, and then place them in [the corresponding region][LUIS-Authoring-Regions].
+
+After you've created your account, you need your [Authoring Key][LUIS-AKey] and a LUIS application ID.
+
+ [LUIS-Authoring-Regions]: https://docs.microsoft.com/azure/cognitive-services/luis/luis-reference-regions#luis-authoring-regions]
+ [LUIS-AKey]: https://docs.microsoft.com/azure/cognitive-services/luis/luis-concept-keys#authoring-key
+
+___
+
+## [Import a new LUIS Application using a local LUIS application](#Table-of-Contents)
+
+### 1. Import the local LUIS application to luis.ai
+
+```bash
+luis import application --region "LuisAppAuthoringRegion" --authoringKey "LuisAuthoringKey" --appName "FlightBooking" --in "./cognitiveModels/FlightBooking.json"
+```
+
+Outputs the following JSON:
+
+```json
+{
+ "id": "########-####-####-####-############",
+ "name": "FlightBooking",
+ "description": "A LUIS model that uses intent and entities.",
+ "culture": "en-us",
+ "usageScenario": "",
+ "domain": "",
+ "versionsCount": 1,
+ "createdDateTime": "2019-03-29T18:32:02Z",
+ "endpoints": {},
+ "endpointHitsCount": 0,
+ "activeVersion": "0.1",
+ "ownerEmail": "bot@contoso.com",
+ "tokenizerVersion": "1.0.0"
+}
+```
+
+For the next step, you'll need the `"id"` value for `--appId` and the `"activeVersion"` value for `--versionId`.
+
+### 2. Train the LUIS Application
+
+```bash
+luis train version --region "LuisAppAuthoringRegion" --authoringKey "LuisAuthoringKey" --appId "LuisAppId" --versionId "LuisAppversion" --wait
+```
+
+### 3. Publish the LUIS Application
+
+```bash
+luis publish version --region "LuisAppAuthoringRegion" --authoringKey "LuisAuthoringKey" --appId "LuisAppId" --versionId "LuisAppversion" --publishRegion "LuisAppPublishRegion"
+```
+
+> `--region` corresponds to the region you _author_ your application in. The regions available for this are "westus", "westeurope" and "australiaeast".
+> These regions correspond to the three available portals, https://luis.ai, https://eu.luis.ai, or https://au.luis.ai.
+> `--publishRegion` corresponds to the region of the endpoint you're publishing to, (e.g. "westus", "southeastasia", "westeurope", "brazilsouth").
+> See the [reference docs][Endpoint-API] for a list of available publish/endpoint regions.
+
+ [Endpoint-API]: https://westus.dev.cognitive.microsoft.com/docs/services/5819c76f40a6350ce09de1ac/operations/5819c77140a63516d81aee78
+
+Outputs the following:
+
+```json
+ {
+ "versionId": "0.1",
+ "isStaging": false,
+ "endpointUrl": "https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/########-####-####-####-############",
+ "region": "westus",
+ "assignedEndpointKey": null,
+ "endpointRegion": "westus",
+ "failedRegions": "",
+ "publishedDateTime": "2019-03-29T18:40:32Z",
+ "directVersionPublish": false
+}
+```
+
+To see how to create an LUIS Cognitive Service Resource in Azure, please see [the next README][README-LUIS]. This Resource should be used when you want to move your bot to production. The instructions will show you how to create and pair the resource with a LUIS Application.
+
+ [README-LUIS]: ./README-LUIS.md
+
+___
+
+## [How to create a LUIS Endpoint resource in Azure and pair it with a LUIS Application](#Table-of-Contents)
+
+### 1. Create a new LUIS Cognitive Services resource on Azure via Azure CLI
+
+> _Note:_
+> _If you don't have a Resource Group in your Azure subscription, you can create one through the Azure portal or through using:_
+> ```bash
+> az group create --subscription "AzureSubscriptionGuid" --location "westus" --name "ResourceGroupName"
+> ```
+> _To see a list of valid locations, use `az account list-locations`_
+
+
+```bash
+# Use Azure CLI to create the LUIS Key resource on Azure
+az cognitiveservices account create --kind "luis" --name "NewLuisResourceName" --sku "S0" --location "westus" --subscription "AzureSubscriptionGuid" -g "ResourceGroupName"
+```
+
+The command will output a response similar to the JSON below:
+
+```json
+{
+ "endpoint": "https://westus.api.cognitive.microsoft.com/luis/v2.0",
+ "etag": "\"########-####-####-####-############\"",
+ "id": "/subscriptions/########-####-####-####-############/resourceGroups/ResourceGroupName/providers/Microsoft.CognitiveServices/accounts/NewLuisResourceName",
+ "internalId": "################################",
+ "kind": "luis",
+ "location": "westus",
+ "name": "NewLuisResourceName",
+ "provisioningState": "Succeeded",
+ "resourceGroup": "ResourceGroupName",
+ "sku": {
+ "name": "S0",
+ "tier": null
+ },
+ "tags": null,
+ "type": "Microsoft.CognitiveServices/accounts"
+}
+```
+
+
+
+Take the output from the previous command and create a JSON file in the following format:
+
+```json
+{
+ "azureSubscriptionId": "00000000-0000-0000-0000-000000000000",
+ "resourceGroup": "ResourceGroupName",
+ "accountName": "NewLuisResourceName"
+}
+```
+
+### 2. Retrieve ARM access token via Azure CLI
+
+```bash
+az account get-access-token --subscription "AzureSubscriptionGuid"
+```
+
+This will return an object that looks like this:
+
+```json
+{
+ "accessToken": "eyJ0eXAiOiJKVtokentokentokentokentokeng1dCI6Ik4tbEMwbi05REFMcXdodUhZbkhRNjNHZUNYYyIsItokenI6Ik4tbEMwbi05REFMcXdodUhZbkhRNjNHZUNYYyJ9.eyJhdWQiOiJodHRwczovL21hbmFnZW1lbnQuY29yZS53aW5kb3dzLm5ldC8iLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC83MmY5ODhiZi04NmYxLTQxYWYtOTFhYi0yZDdjZDAxMWRiNDcvIiwiaWF0IjoxNTUzODc3MTUwLCJuYmYiOjE1NTM4NzcxNTAsImV4cCI6MTU1Mzg4MTA1MCwiX2NsYWltX25hbWVzIjp7Imdyb3VwcyI6InNyYzEifSwiX2NsYWltX3NvdXJjZXMiOnsic3JjMSI6eyJlbmRwb2ludCI6Imh0dHBzOi8vZ3JhcGgud2luZG93cy5uZXQvNzJmOTg4YmYtODZmMS00MWFmLTkxYWItMmQ3Y2QwMTFkYjQ3L3VzZXJzL2ZmZTQyM2RkLWJhM2YtNDg0Ny04NjgyLWExNTI5MDA4MjM4Ny9nZXRNZW1iZXJPYmplY3RzIn19LCJhY3IiOiIxIiwiYWlvIjoiQVZRQXEvOEtBQUFBeGVUc201NDlhVHg4RE1mMFlRVnhGZmxxOE9RSC9PODR3QktuSmRqV1FqTkkwbmxLYzB0bHJEZzMyMFZ5bWZGaVVBSFBvNUFFUTNHL0FZNDRjdk01T3M0SEt0OVJkcE5JZW9WU0dzd0kvSkk9IiwiYW1yIjpbIndpYSIsIm1mYSJdLCJhcHBpZCI6IjA0YjA3Nzk1LThkZGItNDYxYS1iYmVlLTAyZjllMWJmN2I0NiIsImFwcGlkYWNyIjoiMCIsImRldmljZWlkIjoiNDhmNDVjNjEtMTg3Zi00MjUxLTlmZWItMTllZGFkZmMwMmE3IiwiZmFtaWx5X25hbWUiOiJHdW0iLCJnaXZlbl9uYW1lIjoiU3RldmVuIiwiaXBhZGRyIjoiMTY3LjIyMC4yLjU1IiwibmFtZSI6IlN0ZXZlbiBHdW0iLCJvaWQiOiJmZmU0MjNkZC1iYTNmLTQ4NDctODY4Mi1hMTUyOTAwODIzODciLCJvbnByZW1fc2lkIjoiUy0xLTUtMjEtMjEyNzUyMTE4NC0xNjA0MDEyOTIwLTE4ODc5Mjc1MjctMjYwOTgyODUiLCJwdWlkIjoiMTAwMzdGRkVBMDQ4NjlBNyIsInJoIjoiSSIsInNjcCI6InVzZXJfaW1wZXJzb25hdGlvbiIsInN1YiI6Ik1rMGRNMWszN0U5ckJyMjhieUhZYjZLSU85LXVFQVVkZFVhNWpkSUd1Nk0iLCJ0aWQiOiI3MmY5ODhiZi04NmYxLTQxYWYtOTFhYi0yZDdjZDAxMWRiNDciLCJ1bmlxdWVfbmFtZSI6InN0Z3VtQG1pY3Jvc29mdC5jb20iLCJ1cG4iOiJzdGd1bUBtaWNyb3NvZnQuY29tIiwidXRpIjoiT2w2NGN0TXY4RVNEQzZZQWRqRUFtokenInZlciI6IjEuMCJ9.kFAsEilE0mlS1pcpqxf4rEnRKeYsehyk-gz-zJHUrE__oad3QjgDSBDPrR_ikLdweynxbj86pgG4QFaHURNCeE6SzrbaIrNKw-n9jrEtokenlosOxg_0l2g1LeEUOi5Q4gQREAU_zvSbl-RY6sAadpOgNHtGvz3Rc6FZRITfkckSLmsKAOFoh-aWC6tFKG8P52rtB0qVVRz9tovBeNqkMYL49s9ypduygbXNVwSQhm5JszeWDgrFuVFHBUP_iENCQYGQpEZf_KvjmX1Ur1F9Eh9nb4yI2gFlKncKNsQl-tokenK7-tokentokentokentokentokentokenatoken",
+ "expiresOn": "2200-12-31 23:59:59.999999",
+ "subscription": "AzureSubscriptionGuid",
+ "tenant": "tenant-guid",
+ "tokenType": "Bearer"
+}
+```
+
+The value needed for the next step is the `"accessToken"`.
+
+### 3. Use `luis add appazureaccount` to pair your LUIS resource with a LUIS Application
+
+```bash
+luis add appazureaccount --in "path/to/created/requestBody.json" --appId "LuisAppId" --authoringKey "LuisAuthoringKey" --armToken "accessToken"
+```
+
+If successful, it should yield a response like this:
+
+```json
+{
+ "code": "Success",
+ "message": "Operation Successful"
+}
+```
+
+### 4. See the LUIS Cognitive Services' keys
+
+```bash
+az cognitiveservices account keys list --name "NewLuisResourceName" --subscription "AzureSubscriptionGuid" -g "ResourceGroupName"
+```
+
+This will return an object that looks like this:
+
+```json
+{
+ "key1": "9a69####dc8f####8eb4####399f####",
+ "key2": "####f99e####4b1a####fb3b####6b9f"
+}
+```
diff --git a/generators/generators/app/templates/core/project/README.md b/generators/generators/app/templates/core/project/README.md
new file mode 100644
index 000000000..5428395fc
--- /dev/null
+++ b/generators/generators/app/templates/core/project/README.md
@@ -0,0 +1,67 @@
+# <%= botName %>
+
+Bot Framework v4 core bot sample.
+
+This bot has been created using [Bot Framework](https://dev.botframework.com), it shows how to:
+
+- Use [LUIS](https://www.luis.ai) to implement core AI capabilities
+- Implement a multi-turn conversation using Dialogs
+- Handle user interruptions for such things as `Help` or `Cancel`
+- Prompt for and validate requests for information from the user
+
+## Prerequisites
+
+This sample **requires** prerequisites in order to run.
+
+### Overview
+
+This bot uses [LUIS](https://www.luis.ai), an AI based cognitive service, to implement language understanding.
+
+### Create a LUIS Application to enable language understanding
+
+The LUIS model for this example can be found under `cognitiveModels/FlightBooking.json` and the LUIS language model setup, training, and application configuration steps can be found [here](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-howto-v4-luis?view=azure-bot-service-4.0&tabs=cs).
+
+Once you created the LUIS model, update `application.properties` with your `LuisAppId`, `LuisAPIKey` and `LuisAPIHostName`.
+
+```
+ LuisAppId="Your LUIS App Id"
+ LuisAPIKey="Your LUIS Subscription key here"
+ LuisAPIHostName="Your LUIS App region here (i.e: westus.api.cognitive.microsoft.com)"
+```
+
+## To try this sample
+
+- From the root of this project folder:
+ - Build the sample using `mvn package`
+ - Run it by using `java -jar .\target\<%= artifact %>-1.0.0.jar`
+
+## Testing the bot using Bot Framework Emulator
+
+[Bot Framework Emulator](https://github.com/microsoft/botframework-emulator) is a desktop application that allows bot developers to test and debug their bots on localhost or running remotely through a tunnel.
+
+- Install the latest Bot Framework Emulator from [here](https://github.com/Microsoft/BotFramework-Emulator/releases)
+
+### Connect to the bot using Bot Framework Emulator
+
+- Launch Bot Framework Emulator
+- File -> Open Bot
+- Enter a Bot URL of `http://localhost:3978/api/messages`
+
+## Deploy the bot to Azure
+
+To learn more about deploying a bot to Azure, see [Deploy your bot to Azure](https://aka.ms/azuredeployment) for a complete list of deployment instructions.
+
+## Further reading
+
+- [Bot Framework Documentation](https://docs.botframework.com)
+- [Bot Basics](https://docs.microsoft.com/azure/bot-service/bot-builder-basics?view=azure-bot-service-4.0)
+- [Dialogs](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-concept-dialog?view=azure-bot-service-4.0)
+- [Gathering Input Using Prompts](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-prompts?view=azure-bot-service-4.0&tabs=csharp)
+- [Activity processing](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-concept-activity-processing?view=azure-bot-service-4.0)
+- [Azure Bot Service Introduction](https://docs.microsoft.com/azure/bot-service/bot-service-overview-introduction?view=azure-bot-service-4.0)
+- [Azure Bot Service Documentation](https://docs.microsoft.com/azure/bot-service/?view=azure-bot-service-4.0)
+- [Azure CLI](https://docs.microsoft.com/cli/azure/?view=azure-cli-latest)
+- [Azure Portal](https://portal.azure.com)
+- [Language Understanding using LUIS](https://docs.microsoft.com/en-us/azure/cognitive-services/luis/)
+- [Channels and Bot Connector Service](https://docs.microsoft.com/en-us/azure/bot-service/bot-concepts?view=azure-bot-service-4.0)
+- [Spring Boot](https://spring.io/projects/spring-boot)
diff --git a/generators/generators/app/templates/core/project/cognitiveModels/FlightBooking.json b/generators/generators/app/templates/core/project/cognitiveModels/FlightBooking.json
new file mode 100644
index 000000000..603dd06b2
--- /dev/null
+++ b/generators/generators/app/templates/core/project/cognitiveModels/FlightBooking.json
@@ -0,0 +1,339 @@
+{
+ "luis_schema_version": "3.2.0",
+ "versionId": "0.1",
+ "name": "FlightBooking",
+ "desc": "Luis Model for <%= botName %>",
+ "culture": "en-us",
+ "tokenizerVersion": "1.0.0",
+ "intents": [
+ {
+ "name": "BookFlight"
+ },
+ {
+ "name": "Cancel"
+ },
+ {
+ "name": "GetWeather"
+ },
+ {
+ "name": "None"
+ }
+ ],
+ "entities": [],
+ "composites": [
+ {
+ "name": "From",
+ "children": [
+ "Airport"
+ ],
+ "roles": []
+ },
+ {
+ "name": "To",
+ "children": [
+ "Airport"
+ ],
+ "roles": []
+ }
+ ],
+ "closedLists": [
+ {
+ "name": "Airport",
+ "subLists": [
+ {
+ "canonicalForm": "Paris",
+ "list": [
+ "paris",
+ "cdg"
+ ]
+ },
+ {
+ "canonicalForm": "London",
+ "list": [
+ "london",
+ "lhr"
+ ]
+ },
+ {
+ "canonicalForm": "Berlin",
+ "list": [
+ "berlin",
+ "txl"
+ ]
+ },
+ {
+ "canonicalForm": "New York",
+ "list": [
+ "new york",
+ "jfk"
+ ]
+ },
+ {
+ "canonicalForm": "Seattle",
+ "list": [
+ "seattle",
+ "sea"
+ ]
+ }
+ ],
+ "roles": []
+ }
+ ],
+ "patternAnyEntities": [],
+ "regex_entities": [],
+ "prebuiltEntities": [
+ {
+ "name": "datetimeV2",
+ "roles": []
+ }
+ ],
+ "model_features": [],
+ "regex_features": [],
+ "patterns": [],
+ "utterances": [
+ {
+ "text": "book a flight",
+ "intent": "BookFlight",
+ "entities": []
+ },
+ {
+ "text": "book a flight from new york",
+ "intent": "BookFlight",
+ "entities": [
+ {
+ "entity": "From",
+ "startPos": 19,
+ "endPos": 26
+ }
+ ]
+ },
+ {
+ "text": "book a flight from seattle",
+ "intent": "BookFlight",
+ "entities": [
+ {
+ "entity": "From",
+ "startPos": 19,
+ "endPos": 25
+ }
+ ]
+ },
+ {
+ "text": "book a hotel in new york",
+ "intent": "None",
+ "entities": []
+ },
+ {
+ "text": "book a restaurant",
+ "intent": "None",
+ "entities": []
+ },
+ {
+ "text": "book flight from london to paris on feb 14th",
+ "intent": "BookFlight",
+ "entities": [
+ {
+ "entity": "From",
+ "startPos": 17,
+ "endPos": 22
+ },
+ {
+ "entity": "To",
+ "startPos": 27,
+ "endPos": 31
+ }
+ ]
+ },
+ {
+ "text": "book flight to berlin on feb 14th",
+ "intent": "BookFlight",
+ "entities": [
+ {
+ "entity": "To",
+ "startPos": 15,
+ "endPos": 20
+ }
+ ]
+ },
+ {
+ "text": "book me a flight from london to paris",
+ "intent": "BookFlight",
+ "entities": [
+ {
+ "entity": "From",
+ "startPos": 22,
+ "endPos": 27
+ },
+ {
+ "entity": "To",
+ "startPos": 32,
+ "endPos": 36
+ }
+ ]
+ },
+ {
+ "text": "bye",
+ "intent": "Cancel",
+ "entities": []
+ },
+ {
+ "text": "cancel booking",
+ "intent": "Cancel",
+ "entities": []
+ },
+ {
+ "text": "exit",
+ "intent": "Cancel",
+ "entities": []
+ },
+ {
+ "text": "find an airport near me",
+ "intent": "None",
+ "entities": []
+ },
+ {
+ "text": "flight to paris",
+ "intent": "BookFlight",
+ "entities": [
+ {
+ "entity": "To",
+ "startPos": 10,
+ "endPos": 14
+ }
+ ]
+ },
+ {
+ "text": "flight to paris from london on feb 14th",
+ "intent": "BookFlight",
+ "entities": [
+ {
+ "entity": "To",
+ "startPos": 10,
+ "endPos": 14
+ },
+ {
+ "entity": "From",
+ "startPos": 21,
+ "endPos": 26
+ }
+ ]
+ },
+ {
+ "text": "fly from berlin to paris on may 5th",
+ "intent": "BookFlight",
+ "entities": [
+ {
+ "entity": "From",
+ "startPos": 9,
+ "endPos": 14
+ },
+ {
+ "entity": "To",
+ "startPos": 19,
+ "endPos": 23
+ }
+ ]
+ },
+ {
+ "text": "go to paris",
+ "intent": "BookFlight",
+ "entities": [
+ {
+ "entity": "To",
+ "startPos": 6,
+ "endPos": 10
+ }
+ ]
+ },
+ {
+ "text": "going from paris to berlin",
+ "intent": "BookFlight",
+ "entities": [
+ {
+ "entity": "From",
+ "startPos": 11,
+ "endPos": 15
+ },
+ {
+ "entity": "To",
+ "startPos": 20,
+ "endPos": 25
+ }
+ ]
+ },
+ {
+ "text": "i'd like to rent a car",
+ "intent": "None",
+ "entities": []
+ },
+ {
+ "text": "ignore",
+ "intent": "Cancel",
+ "entities": []
+ },
+ {
+ "text": "travel from new york to paris",
+ "intent": "BookFlight",
+ "entities": [
+ {
+ "entity": "From",
+ "startPos": 12,
+ "endPos": 19
+ },
+ {
+ "entity": "To",
+ "startPos": 24,
+ "endPos": 28
+ }
+ ]
+ },
+ {
+ "text": "travel to new york",
+ "intent": "BookFlight",
+ "entities": [
+ {
+ "entity": "To",
+ "startPos": 10,
+ "endPos": 17
+ }
+ ]
+ },
+ {
+ "text": "travel to paris",
+ "intent": "BookFlight",
+ "entities": [
+ {
+ "entity": "To",
+ "startPos": 10,
+ "endPos": 14
+ }
+ ]
+ },
+ {
+ "text": "what's the forecast for this friday?",
+ "intent": "GetWeather",
+ "entities": []
+ },
+ {
+ "text": "what's the weather like for tomorrow",
+ "intent": "GetWeather",
+ "entities": []
+ },
+ {
+ "text": "what's the weather like in new york",
+ "intent": "GetWeather",
+ "entities": []
+ },
+ {
+ "text": "what's the weather like?",
+ "intent": "GetWeather",
+ "entities": []
+ },
+ {
+ "text": "winter is coming",
+ "intent": "None",
+ "entities": []
+ }
+ ],
+ "settings": []
+}
diff --git a/generators/generators/app/templates/core/project/deploymentTemplates/template-with-new-rg.json b/generators/generators/app/templates/core/project/deploymentTemplates/template-with-new-rg.json
new file mode 100644
index 000000000..196cfb933
--- /dev/null
+++ b/generators/generators/app/templates/core/project/deploymentTemplates/template-with-new-rg.json
@@ -0,0 +1,292 @@
+{
+ "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "groupLocation": {
+ "defaultValue": "",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the location of the Resource Group."
+ }
+ },
+ "groupName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the name of the Resource Group."
+ }
+ },
+ "appId": {
+ "type": "string",
+ "metadata": {
+ "description": "Active Directory App ID, set as MicrosoftAppId in the Web App's Application Settings."
+ }
+ },
+ "appSecret": {
+ "type": "string",
+ "metadata": {
+ "description": "Active Directory App Password, set as MicrosoftAppPassword in the Web App's Application Settings."
+ }
+ },
+ "botId": {
+ "type": "string",
+ "metadata": {
+ "description": "The globally unique and immutable bot ID. Also used to configure the displayName of the bot, which is mutable."
+ }
+ },
+ "botSku": {
+ "defaultValue": "S1",
+ "type": "string",
+ "metadata": {
+ "description": "The pricing tier of the Bot Service Registration. Acceptable values are F0 and S1."
+ }
+ },
+ "newAppServicePlanName": {
+ "defaultValue": "",
+ "type": "string",
+ "metadata": {
+ "description": "The name of the App Service Plan."
+ }
+ },
+ "newAppServicePlanSku": {
+ "type": "object",
+ "defaultValue": {
+ "name": "P1v2",
+ "tier": "PremiumV2",
+ "size": "P1v2",
+ "family": "Pv2",
+ "capacity": 1
+ },
+ "metadata": {
+ "description": "The SKU of the App Service Plan. Defaults to Standard values."
+ }
+ },
+ "newAppServicePlanLocation": {
+ "defaultValue": "",
+ "type": "string",
+ "metadata": {
+ "description": "The location of the App Service Plan. Defaults to \"westus\"."
+ }
+ },
+ "newWebAppName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The globally unique name of the Web App. Defaults to the value passed in for \"botId\"."
+ }
+ }
+ },
+ "variables": {
+ "appServicePlanName": "[parameters('newAppServicePlanName')]",
+ "resourcesLocation": "[parameters('newAppServicePlanLocation')]",
+ "webAppName": "[if(empty(parameters('newWebAppName')), parameters('botId'), parameters('newWebAppName'))]",
+ "siteHost": "[concat(variables('webAppName'), '.azurewebsites.net')]",
+ "botEndpoint": "[concat('https://', variables('siteHost'), '/api/messages')]",
+ "publishingUsername": "[concat('$', parameters('newWebAppName'))]",
+ "resourceGroupId": "[concat(subscription().id, '/resourceGroups/', parameters('groupName'))]"
+ },
+ "resources": [
+ {
+ "name": "[parameters('groupName')]",
+ "type": "Microsoft.Resources/resourceGroups",
+ "apiVersion": "2018-05-01",
+ "location": "[parameters('groupLocation')]",
+ "properties": {}
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2018-05-01",
+ "name": "storageDeployment",
+ "resourceGroup": "[parameters('groupName')]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Resources/resourceGroups/', parameters('groupName'))]"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "template": {
+ "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {},
+ "variables": {},
+ "resources": [
+ {
+ "comments": "Create a new Linux App Service Plan if no existing App Service Plan name was passed in.",
+ "type": "Microsoft.Web/serverfarms",
+ "name": "[variables('appServicePlanName')]",
+ "apiVersion": "2018-02-01",
+ "location": "[variables('resourcesLocation')]",
+ "sku": "[parameters('newAppServicePlanSku')]",
+ "kind": "linux",
+ "properties": {
+ "perSiteScaling": false,
+ "maximumElasticWorkerCount": 1,
+ "isSpot": false,
+ "reserved": true,
+ "isXenon": false,
+ "hyperV": false,
+ "targetWorkerCount": 0,
+ "targetWorkerSizeId": 0
+ }
+ },
+ {
+ "comments": "Create a Web App using a Linux App Service Plan",
+ "type": "Microsoft.Web/sites",
+ "apiVersion": "2018-11-01",
+ "location": "[variables('resourcesLocation')]",
+ "kind": "app,linux",
+ "dependsOn": [
+ "[concat(variables('resourceGroupId'), '/providers/Microsoft.Web/serverfarms/', variables('appServicePlanName'))]"
+ ],
+ "name": "[variables('webAppName')]",
+ "properties": {
+ "name": "[variables('webAppName')]",
+ "hostNameSslStates": [
+ {
+ "name": "[concat(parameters('newWebAppName'), '.azurewebsites.net')]",
+ "sslState": "Disabled",
+ "hostType": "Standard"
+ },
+ {
+ "name": "[concat(parameters('newWebAppName'), '.scm.azurewebsites.net')]",
+ "sslState": "Disabled",
+ "hostType": "Repository"
+ }
+ ],
+ "serverFarmId": "[variables('appServicePlanName')]",
+ "reserved": true,
+ "isXenon": false,
+ "hyperV": false,
+ "scmSiteAlsoStopped": false,
+ "clientAffinityEnabled": true,
+ "clientCertEnabled": false,
+ "hostNamesDisabled": false,
+ "containerSize": 0,
+ "dailyMemoryTimeQuota": 0,
+ "httpsOnly": false,
+ "redundancyMode": "None",
+ "siteConfig": {
+ "appSettings": [
+ {
+ "name": "JAVA_OPTS",
+ "value": "-Dserver.port=80"
+ },
+ {
+ "name": "MicrosoftAppId",
+ "value": "[parameters('appId')]"
+ },
+ {
+ "name": "MicrosoftAppPassword",
+ "value": "[parameters('appSecret')]"
+ }
+ ],
+ "cors": {
+ "allowedOrigins": [
+ "https://botservice.hosting.portal.azure.net",
+ "https://hosting.onecloud.azure-test.net/"
+ ]
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Web/sites/config",
+ "apiVersion": "2018-11-01",
+ "name": "[concat(variables('webAppName'), '/web')]",
+ "location": "[variables('resourcesLocation')]",
+ "dependsOn": [
+ "[concat(variables('resourceGroupId'), '/providers/Microsoft.Web/sites/', variables('webAppName'))]"
+ ],
+ "properties": {
+ "numberOfWorkers": 1,
+ "defaultDocuments": [
+ "Default.htm",
+ "Default.html",
+ "Default.asp",
+ "index.htm",
+ "index.html",
+ "iisstart.htm",
+ "default.aspx",
+ "index.php",
+ "hostingstart.html"
+ ],
+ "netFrameworkVersion": "v4.0",
+ "linuxFxVersion": "JAVA|8-jre8",
+ "requestTracingEnabled": false,
+ "remoteDebuggingEnabled": false,
+ "httpLoggingEnabled": false,
+ "logsDirectorySizeLimit": 35,
+ "detailedErrorLoggingEnabled": false,
+ "publishingUsername": "[variables('publishingUsername')]",
+ "scmType": "None",
+ "use32BitWorkerProcess": true,
+ "webSocketsEnabled": false,
+ "alwaysOn": true,
+ "managedPipelineMode": "Integrated",
+ "virtualApplications": [
+ {
+ "virtualPath": "/",
+ "physicalPath": "site\\wwwroot",
+ "preloadEnabled": true
+ }
+ ],
+ "loadBalancing": "LeastRequests",
+ "experiments": {
+ "rampUpRules": []
+ },
+ "autoHealEnabled": false,
+ "localMySqlEnabled": false,
+ "ipSecurityRestrictions": [
+ {
+ "ipAddress": "Any",
+ "action": "Allow",
+ "priority": 1,
+ "name": "Allow all",
+ "description": "Allow all access"
+ }
+ ],
+ "scmIpSecurityRestrictions": [
+ {
+ "ipAddress": "Any",
+ "action": "Allow",
+ "priority": 1,
+ "name": "Allow all",
+ "description": "Allow all access"
+ }
+ ],
+ "scmIpSecurityRestrictionsUseMain": false,
+ "http20Enabled": false,
+ "minTlsVersion": "1.2",
+ "ftpsState": "AllAllowed",
+ "reservedInstanceCount": 0
+ }
+ },
+ {
+ "apiVersion": "2021-03-01",
+ "type": "Microsoft.BotService/botServices",
+ "name": "[parameters('botId')]",
+ "location": "global",
+ "kind": "azurebot",
+ "sku": {
+ "name": "[parameters('botSku')]"
+ },
+ "properties": {
+ "name": "[parameters('botId')]",
+ "displayName": "[parameters('botId')]",
+ "iconUrl": "https://docs.botframework.com/static/devportal/client/images/bot-framework-default.png",
+ "endpoint": "[variables('botEndpoint')]",
+ "msaAppId": "[parameters('appId')]",
+ "luisAppIds": [],
+ "schemaTransformationVersion": "1.3",
+ "isCmekEnabled": false,
+ "isIsolated": false
+ },
+ "dependsOn": [
+ "[concat(variables('resourceGroupId'), '/providers/Microsoft.Web/sites/', variables('webAppName'))]"
+ ]
+ }
+ ],
+ "outputs": {}
+ }
+ }
+ }
+ ]
+}
diff --git a/generators/generators/app/templates/core/project/deploymentTemplates/template-with-preexisting-rg.json b/generators/generators/app/templates/core/project/deploymentTemplates/template-with-preexisting-rg.json
new file mode 100644
index 000000000..d6feb0a0f
--- /dev/null
+++ b/generators/generators/app/templates/core/project/deploymentTemplates/template-with-preexisting-rg.json
@@ -0,0 +1,260 @@
+{
+ "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "appId": {
+ "type": "string",
+ "metadata": {
+ "description": "Active Directory App ID, set as MicrosoftAppId in the Web App's Application Settings."
+ }
+ },
+ "appSecret": {
+ "type": "string",
+ "metadata": {
+ "description": "Active Directory App Password, set as MicrosoftAppPassword in the Web App's Application Settings. Defaults to \"\"."
+ }
+ },
+ "botId": {
+ "type": "string",
+ "metadata": {
+ "description": "The globally unique and immutable bot ID. Also used to configure the displayName of the bot, which is mutable."
+ }
+ },
+ "botSku": {
+ "defaultValue": "S1",
+ "type": "string",
+ "metadata": {
+ "description": "The pricing tier of the Bot Service Registration. Acceptable values are F0 and S1."
+ }
+ },
+ "newAppServicePlanName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The name of the new App Service Plan."
+ }
+ },
+ "newAppServicePlanSku": {
+ "type": "object",
+ "defaultValue": {
+ "name": "P1v2",
+ "tier": "PremiumV2",
+ "size": "P1v2",
+ "family": "Pv2",
+ "capacity": 1
+ },
+ "metadata": {
+ "description": "The SKU of the App Service Plan. Defaults to Standard values."
+ }
+ },
+ "appServicePlanLocation": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The location of the App Service Plan."
+ }
+ },
+ "existingAppServicePlan": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Name of the existing App Service Plan used to create the Web App for the bot."
+ }
+ },
+ "newWebAppName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The globally unique name of the Web App. Defaults to the value passed in for \"botId\"."
+ }
+ }
+ },
+ "variables": {
+ "defaultAppServicePlanName": "[if(empty(parameters('existingAppServicePlan')), 'createNewAppServicePlan', parameters('existingAppServicePlan'))]",
+ "useExistingAppServicePlan": "[not(equals(variables('defaultAppServicePlanName'), 'createNewAppServicePlan'))]",
+ "servicePlanName": "[if(variables('useExistingAppServicePlan'), parameters('existingAppServicePlan'), parameters('newAppServicePlanName'))]",
+ "publishingUsername": "[concat('$', parameters('newWebAppName'))]",
+ "resourcesLocation": "[parameters('appServicePlanLocation')]",
+ "webAppName": "[if(empty(parameters('newWebAppName')), parameters('botId'), parameters('newWebAppName'))]",
+ "siteHost": "[concat(variables('webAppName'), '.azurewebsites.net')]",
+ "botEndpoint": "[concat('https://', variables('siteHost'), '/api/messages')]"
+ },
+ "resources": [
+ {
+ "comments": "Create a new Linux App Service Plan if no existing App Service Plan name was passed in.",
+ "type": "Microsoft.Web/serverfarms",
+ "condition": "[not(variables('useExistingAppServicePlan'))]",
+ "name": "[variables('servicePlanName')]",
+ "apiVersion": "2018-02-01",
+ "location": "[variables('resourcesLocation')]",
+ "sku": "[parameters('newAppServicePlanSku')]",
+ "kind": "linux",
+ "properties": {
+ "perSiteScaling": false,
+ "maximumElasticWorkerCount": 1,
+ "isSpot": false,
+ "reserved": true,
+ "isXenon": false,
+ "hyperV": false,
+ "targetWorkerCount": 0,
+ "targetWorkerSizeId": 0
+ }
+ },
+ {
+ "comments": "Create a Web App using a Linux App Service Plan",
+ "type": "Microsoft.Web/sites",
+ "apiVersion": "2018-11-01",
+ "location": "[variables('resourcesLocation')]",
+ "kind": "app,linux",
+ "dependsOn": [
+ "[resourceId('Microsoft.Web/serverfarms', variables('servicePlanName'))]"
+ ],
+ "name": "[variables('webAppName')]",
+ "properties": {
+ "name": "[variables('webAppName')]",
+ "hostNameSslStates": [
+ {
+ "name": "[concat(parameters('newWebAppName'), '.azurewebsites.net')]",
+ "sslState": "Disabled",
+ "hostType": "Standard"
+ },
+ {
+ "name": "[concat(parameters('newWebAppName'), '.scm.azurewebsites.net')]",
+ "sslState": "Disabled",
+ "hostType": "Repository"
+ }
+ ],
+ "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('servicePlanName'))]",
+ "reserved": true,
+ "isXenon": false,
+ "hyperV": false,
+ "scmSiteAlsoStopped": false,
+ "clientAffinityEnabled": true,
+ "clientCertEnabled": false,
+ "hostNamesDisabled": false,
+ "containerSize": 0,
+ "dailyMemoryTimeQuota": 0,
+ "httpsOnly": false,
+ "redundancyMode": "None",
+ "siteConfig": {
+ "appSettings": [
+ {
+ "name": "JAVA_OPTS",
+ "value": "-Dserver.port=80"
+ },
+ {
+ "name": "MicrosoftAppId",
+ "value": "[parameters('appId')]"
+ },
+ {
+ "name": "MicrosoftAppPassword",
+ "value": "[parameters('appSecret')]"
+ }
+ ],
+ "cors": {
+ "allowedOrigins": [
+ "https://botservice.hosting.portal.azure.net",
+ "https://hosting.onecloud.azure-test.net/"
+ ]
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Web/sites/config",
+ "apiVersion": "2018-11-01",
+ "name": "[concat(variables('webAppName'), '/web')]",
+ "location": "[variables('resourcesLocation')]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Web/sites/', variables('webAppName'))]"
+ ],
+ "properties": {
+ "numberOfWorkers": 1,
+ "defaultDocuments": [
+ "Default.htm",
+ "Default.html",
+ "Default.asp",
+ "index.htm",
+ "index.html",
+ "iisstart.htm",
+ "default.aspx",
+ "index.php",
+ "hostingstart.html"
+ ],
+ "netFrameworkVersion": "v4.0",
+ "linuxFxVersion": "JAVA|8-jre8",
+ "requestTracingEnabled": false,
+ "remoteDebuggingEnabled": false,
+ "httpLoggingEnabled": false,
+ "logsDirectorySizeLimit": 35,
+ "detailedErrorLoggingEnabled": false,
+ "publishingUsername": "[variables('publishingUsername')]",
+ "scmType": "None",
+ "use32BitWorkerProcess": true,
+ "webSocketsEnabled": false,
+ "alwaysOn": true,
+ "managedPipelineMode": "Integrated",
+ "virtualApplications": [
+ {
+ "virtualPath": "/",
+ "physicalPath": "site\\wwwroot",
+ "preloadEnabled": true
+ }
+ ],
+ "loadBalancing": "LeastRequests",
+ "experiments": {
+ "rampUpRules": []
+ },
+ "autoHealEnabled": false,
+ "localMySqlEnabled": false,
+ "ipSecurityRestrictions": [
+ {
+ "ipAddress": "Any",
+ "action": "Allow",
+ "priority": 1,
+ "name": "Allow all",
+ "description": "Allow all access"
+ }
+ ],
+ "scmIpSecurityRestrictions": [
+ {
+ "ipAddress": "Any",
+ "action": "Allow",
+ "priority": 1,
+ "name": "Allow all",
+ "description": "Allow all access"
+ }
+ ],
+ "scmIpSecurityRestrictionsUseMain": false,
+ "http20Enabled": false,
+ "minTlsVersion": "1.2",
+ "ftpsState": "AllAllowed",
+ "reservedInstanceCount": 0
+ }
+ },
+ {
+ "apiVersion": "2021-03-01",
+ "type": "Microsoft.BotService/botServices",
+ "name": "[parameters('botId')]",
+ "location": "global",
+ "kind": "azurebot",
+ "sku": {
+ "name": "[parameters('botSku')]"
+ },
+ "properties": {
+ "name": "[parameters('botId')]",
+ "displayName": "[parameters('botId')]",
+ "iconUrl": "https://docs.botframework.com/static/devportal/client/images/bot-framework-default.png",
+ "endpoint": "[variables('botEndpoint')]",
+ "msaAppId": "[parameters('appId')]",
+ "luisAppIds": [],
+ "schemaTransformationVersion": "1.3",
+ "isCmekEnabled": false,
+ "isIsolated": false
+ },
+ "dependsOn": [
+ "[resourceId('Microsoft.Web/sites/', variables('webAppName'))]"
+ ]
+ }
+ ]
+}
diff --git a/generators/generators/app/templates/core/project/pom.xml b/generators/generators/app/templates/core/project/pom.xml
new file mode 100644
index 000000000..8306e22f8
--- /dev/null
+++ b/generators/generators/app/templates/core/project/pom.xml
@@ -0,0 +1,254 @@
+
+
+
+ 4.0.0
+
+ <%= packageName %>
+ <%= artifact %>
+ 1.0.0
+ jar
+
+ ${project.groupId}:${project.artifactId}
+ This package contains a Java Core Bot sample using Spring Boot.
+ http://maven.apache.org
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.4.0
+
+
+
+
+
+ MIT License
+ http://www.opensource.org/licenses/mit-license.php
+
+
+
+
+
+ Bot Framework Development
+
+ Microsoft
+ https://dev.botframework.com/
+
+
+
+
+ 1.8
+ 1.8
+ 1.8
+ <%= packageName %>.Application
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ 2.4.0
+ test
+
+
+ junit
+ junit
+ 4.13.1
+ test
+
+
+ org.junit.vintage
+ junit-vintage-engine
+ test
+
+
+
+ org.slf4j
+ slf4j-api
+
+
+ org.apache.logging.log4j
+ log4j-api
+ 2.17.1
+
+
+ org.apache.logging.log4j
+ log4j-core
+ 2.17.1
+
+
+ org.apache.logging.log4j
+ log4j-to-slf4j
+ 2.15.0
+ test
+
+
+
+ com.microsoft.bot
+ bot-integration-spring
+ 4.14.1
+ compile
+
+
+ com.microsoft.bot
+ bot-dialogs
+ 4.14.1
+
+
+ com.microsoft.bot
+ bot-ai-luis-v3
+ 4.14.1
+
+
+
+
+
+ build
+
+ true
+
+
+
+
+ src/main/resources
+ false
+
+
+
+
+ maven-compiler-plugin
+ 3.8.1
+
+
+ maven-war-plugin
+ 3.2.3
+
+ src/main/webapp
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ repackage
+
+
+ <%= packageName %>.Application
+
+
+
+
+
+ com.microsoft.azure
+ azure-webapp-maven-plugin
+ 1.12.0
+
+ V2
+ ${groupname}
+ ${botname}
+
+
+ JAVA_OPTS
+ -Dserver.port=80
+
+
+
+ linux
+ Java 8
+ Java SE
+
+
+
+
+ ${project.basedir}/target
+
+ *.jar
+
+
+
+
+
+
+
+
+
+
+
+ publish
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ maven-war-plugin
+ 3.2.3
+
+ src/main/webapp
+
+
+
+
+ org.sonatype.plugins
+ nexus-staging-maven-plugin
+ 1.6.8
+ true
+
+ true
+ ossrh
+ https://oss.sonatype.org/
+ true
+
+
+
+
+ org.apache.maven.plugins
+ maven-gpg-plugin
+
+
+ sign-artifacts
+ verify
+
+ sign
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+
+ 8
+ false
+
+
+
+ attach-javadocs
+
+ jar
+
+
+
+
+
+
+
+
+
diff --git a/generators/generators/app/templates/core/project/src/main/resources/application.properties b/generators/generators/app/templates/core/project/src/main/resources/application.properties
new file mode 100644
index 000000000..255d7cd56
--- /dev/null
+++ b/generators/generators/app/templates/core/project/src/main/resources/application.properties
@@ -0,0 +1,6 @@
+MicrosoftAppId=
+MicrosoftAppPassword=
+LuisAppId=
+LuisAPIKey=
+LuisAPIHostName=
+server.port=3978
diff --git a/generators/generators/app/templates/core/project/src/main/resources/cards/welcomeCard.json b/generators/generators/app/templates/core/project/src/main/resources/cards/welcomeCard.json
new file mode 100644
index 000000000..9b6389e39
--- /dev/null
+++ b/generators/generators/app/templates/core/project/src/main/resources/cards/welcomeCard.json
@@ -0,0 +1,46 @@
+{
+ "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
+ "type": "AdaptiveCard",
+ "version": "1.0",
+ "body": [
+ {
+ "type": "Image",
+ "url": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQtB3AwMUeNoq4gUBGe6Ocj8kyh3bXa9ZbV7u1fVKQoyKFHdkqU",
+ "size": "stretch"
+ },
+ {
+ "type": "TextBlock",
+ "spacing": "medium",
+ "size": "default",
+ "weight": "bolder",
+ "text": "Welcome to Bot Framework!",
+ "wrap": true,
+ "maxLines": 0
+ },
+ {
+ "type": "TextBlock",
+ "size": "default",
+ "isSubtle": true,
+ "text": "Now that you have successfully run your bot, follow the links in this Adaptive Card to expand your knowledge of Bot Framework.",
+ "wrap": true,
+ "maxLines": 0
+ }
+ ],
+ "actions": [
+ {
+ "type": "Action.OpenUrl",
+ "title": "Get an overview",
+ "url": "https://docs.microsoft.com/en-us/azure/bot-service/?view=azure-bot-service-4.0"
+ },
+ {
+ "type": "Action.OpenUrl",
+ "title": "Ask a question",
+ "url": "https://stackoverflow.com/questions/tagged/botframework"
+ },
+ {
+ "type": "Action.OpenUrl",
+ "title": "Learn how to deploy",
+ "url": "https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-howto-deploy-azure?view=azure-bot-service-4.0"
+ }
+ ]
+}
diff --git a/generators/generators/app/templates/core/project/src/main/resources/log4j2.json b/generators/generators/app/templates/core/project/src/main/resources/log4j2.json
new file mode 100644
index 000000000..67c0ad530
--- /dev/null
+++ b/generators/generators/app/templates/core/project/src/main/resources/log4j2.json
@@ -0,0 +1,18 @@
+{
+ "configuration": {
+ "name": "Default",
+ "appenders": {
+ "Console": {
+ "name": "Console-Appender",
+ "target": "SYSTEM_OUT",
+ "PatternLayout": {"pattern": "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"}
+ }
+ },
+ "loggers": {
+ "root": {
+ "level": "debug",
+ "appender-ref": {"ref": "Console-Appender","level": "debug"}
+ }
+ }
+ }
+}
diff --git a/generators/generators/app/templates/core/project/src/main/webapp/META-INF/MANIFEST.MF b/generators/generators/app/templates/core/project/src/main/webapp/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..254272e1c
--- /dev/null
+++ b/generators/generators/app/templates/core/project/src/main/webapp/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Class-Path:
+
diff --git a/generators/generators/app/templates/core/project/src/main/webapp/WEB-INF/web.xml b/generators/generators/app/templates/core/project/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 000000000..383c19004
--- /dev/null
+++ b/generators/generators/app/templates/core/project/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,12 @@
+
+
+ dispatcher
+
+ org.springframework.web.servlet.DispatcherServlet
+
+
+ contextConfigLocation
+ /WEB-INF/spring/dispatcher-config.xml
+
+ 1
+
\ No newline at end of file
diff --git a/generators/generators/app/templates/core/project/src/main/webapp/index.html b/generators/generators/app/templates/core/project/src/main/webapp/index.html
new file mode 100644
index 000000000..593ac520c
--- /dev/null
+++ b/generators/generators/app/templates/core/project/src/main/webapp/index.html
@@ -0,0 +1,417 @@
+
+
+
+
+
+
+ <%= botName %>
+
+
+
+
+
+
+
+
+
Your bot is ready!
+
You can test your bot in the Bot Framework Emulator
+ by connecting to http://localhost:3978/api/messages.
+
+
Visit
Azure
+ Bot Service to register your bot and add it to
+ various channels. The bot's endpoint URL typically looks
+ like this:
+
https://your_bots_hostname /api/messages
+
+
+
+
+
+
diff --git a/generators/generators/app/templates/core/src/main/java/Application.java b/generators/generators/app/templates/core/src/main/java/Application.java
new file mode 100644
index 000000000..7f99e415d
--- /dev/null
+++ b/generators/generators/app/templates/core/src/main/java/Application.java
@@ -0,0 +1,79 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package <%= packageName %>;
+
+import com.microsoft.bot.builder.Bot;
+import com.microsoft.bot.builder.ConversationState;
+import com.microsoft.bot.builder.UserState;
+import com.microsoft.bot.integration.AdapterWithErrorHandler;
+import com.microsoft.bot.integration.BotFrameworkHttpAdapter;
+import com.microsoft.bot.integration.Configuration;
+import com.microsoft.bot.integration.spring.BotController;
+import com.microsoft.bot.integration.spring.BotDependencyConfiguration;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Import;
+
+/**
+ * This is the starting point of the Sprint Boot Bot application.
+ */
+@SpringBootApplication
+
+// Use the default BotController to receive incoming Channel messages. A custom
+// controller could be used by eliminating this import and creating a new
+// org.springframework.web.bind.annotation.RestController.
+// The default controller is created by the Spring Boot container using
+// dependency injection. The default route is /api/messages.
+@Import({BotController.class})
+
+/**
+ * This class extends the BotDependencyConfiguration which provides the default
+ * implementations for a Bot application. The Application class should
+ * override methods in order to provide custom implementations.
+ */
+public class Application extends BotDependencyConfiguration {
+
+ /**
+ * The start method.
+ *
+ * @param args The args.
+ */
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+ /**
+ * Returns the Bot for this application.
+ *
+ *
+ * The @Component annotation could be used on the Bot class instead of this method with the
+ * @Bean annotation.
+ *
+ *
+ * @return The Bot implementation for this application.
+ */
+ @Bean
+ public Bot getBot(
+ Configuration configuration,
+ UserState userState,
+ ConversationState conversationState
+ ) {
+ FlightBookingRecognizer recognizer = new FlightBookingRecognizer(configuration);
+ MainDialog dialog = new MainDialog(recognizer, new BookingDialog());
+ return new DialogAndWelcomeBot<>(conversationState, userState, dialog);
+ }
+
+ /**
+ * Returns a custom Adapter that provides error handling.
+ *
+ * @param configuration The Configuration object to use.
+ * @return An error handling BotFrameworkHttpAdapter.
+ */
+ @Override
+ public BotFrameworkHttpAdapter getBotFrameworkHttpAdaptor(Configuration configuration) {
+ return new AdapterWithErrorHandler(configuration);
+ }
+}
+
diff --git a/generators/generators/app/templates/core/src/main/java/BookingDetails.java b/generators/generators/app/templates/core/src/main/java/BookingDetails.java
new file mode 100644
index 000000000..160242106
--- /dev/null
+++ b/generators/generators/app/templates/core/src/main/java/BookingDetails.java
@@ -0,0 +1,68 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package <%= packageName %>;
+
+/**
+ * The model class to retrieve the information of the booking.
+ */
+public class BookingDetails {
+
+ private String destination;
+ private String origin;
+ private String travelDate;
+
+ /**
+ * Gets the destination of the booking.
+ *
+ * @return The destination.
+ */
+ public String getDestination() {
+ return destination;
+ }
+
+ /**
+ * Sets the destination of the booking.
+ *
+ * @param withDestination The new destination.
+ */
+ public void setDestination(String withDestination) {
+ this.destination = withDestination;
+ }
+
+ /**
+ * Gets the origin of the booking.
+ *
+ * @return The origin.
+ */
+ public String getOrigin() {
+ return origin;
+ }
+
+ /**
+ * Sets the origin of the booking.
+ *
+ * @param withOrigin The new origin.
+ */
+ public void setOrigin(String withOrigin) {
+ this.origin = withOrigin;
+ }
+
+ /**
+ * Gets the travel date of the booking.
+ *
+ * @return The travel date.
+ */
+ public String getTravelDate() {
+ return travelDate;
+ }
+
+ /**
+ * Sets the travel date of the booking.
+ *
+ * @param withTravelDate The new travel date.
+ */
+ public void setTravelDate(String withTravelDate) {
+ this.travelDate = withTravelDate;
+ }
+}
diff --git a/generators/generators/app/templates/core/src/main/java/BookingDialog.java b/generators/generators/app/templates/core/src/main/java/BookingDialog.java
new file mode 100644
index 000000000..d5e7322b3
--- /dev/null
+++ b/generators/generators/app/templates/core/src/main/java/BookingDialog.java
@@ -0,0 +1,127 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package <%= packageName %>;
+
+import java.util.Arrays;
+import java.util.concurrent.CompletableFuture;
+
+import com.microsoft.bot.builder.MessageFactory;
+import com.microsoft.bot.dialogs.DialogTurnResult;
+import com.microsoft.bot.dialogs.WaterfallDialog;
+import com.microsoft.bot.dialogs.WaterfallStep;
+import com.microsoft.bot.dialogs.WaterfallStepContext;
+import com.microsoft.bot.dialogs.prompts.ConfirmPrompt;
+import com.microsoft.bot.dialogs.prompts.PromptOptions;
+import com.microsoft.bot.dialogs.prompts.TextPrompt;
+import com.microsoft.bot.schema.Activity;
+import com.microsoft.bot.schema.InputHints;
+import com.microsoft.recognizers.datatypes.timex.expression.Constants;
+import com.microsoft.recognizers.datatypes.timex.expression.TimexProperty;
+
+/**
+ * The class containing the booking dialogs.
+ */
+public class BookingDialog extends CancelAndHelpDialog {
+
+ private final String destinationStepMsgText = "Where would you like to travel to?";
+ private final String originStepMsgText = "Where are you traveling from?";
+
+ /**
+ * The constructor of the Booking Dialog class.
+ */
+ public BookingDialog() {
+ super("BookingDialog");
+
+ addDialog(new TextPrompt("TextPrompt"));
+ addDialog(new ConfirmPrompt("ConfirmPrompt"));
+ addDialog(new DateResolverDialog(null));
+ WaterfallStep[] waterfallSteps = {
+ this::destinationStep,
+ this::originStep,
+ this::travelDateStep,
+ this::confirmStep,
+ this::finalStep
+ };
+ addDialog(new WaterfallDialog("WaterfallDialog", Arrays.asList(waterfallSteps)));
+
+ // The initial child Dialog to run.
+ setInitialDialogId("WaterfallDialog");
+ }
+
+ private CompletableFuture destinationStep(WaterfallStepContext stepContext) {
+ BookingDetails bookingDetails = (BookingDetails) stepContext.getOptions();
+
+ if (bookingDetails.getDestination() == null || bookingDetails.getDestination().trim().isEmpty()) {
+ Activity promptMessage =
+ MessageFactory.text(destinationStepMsgText, destinationStepMsgText,
+ InputHints.EXPECTING_INPUT
+ );
+ PromptOptions promptOptions = new PromptOptions();
+ promptOptions.setPrompt(promptMessage);
+ return stepContext.prompt("TextPrompt", promptOptions);
+ }
+
+ return stepContext.next(bookingDetails.getDestination());
+ }
+
+ private CompletableFuture originStep(WaterfallStepContext stepContext) {
+ BookingDetails bookingDetails = (BookingDetails) stepContext.getOptions();
+
+ bookingDetails.setDestination((String) stepContext.getResult());
+
+ if (bookingDetails.getOrigin() == null || bookingDetails.getOrigin().trim().isEmpty()) {
+ Activity promptMessage =
+ MessageFactory
+ .text(originStepMsgText, originStepMsgText, InputHints.EXPECTING_INPUT);
+ PromptOptions promptOptions = new PromptOptions();
+ promptOptions.setPrompt(promptMessage);
+ return stepContext.prompt("TextPrompt", promptOptions);
+ }
+
+ return stepContext.next(bookingDetails.getOrigin());
+ }
+
+ private CompletableFuture travelDateStep(WaterfallStepContext stepContext) {
+ BookingDetails bookingDetails = (BookingDetails) stepContext.getOptions();
+
+ bookingDetails.setOrigin((String) stepContext.getResult());
+
+ if (bookingDetails.getTravelDate() == null || isAmbiguous(bookingDetails.getTravelDate())) {
+ return stepContext.beginDialog("DateResolverDialog", bookingDetails.getTravelDate());
+ }
+
+ return stepContext.next(bookingDetails.getTravelDate());
+ }
+
+ private CompletableFuture confirmStep(WaterfallStepContext stepContext) {
+ BookingDetails bookingDetails = (BookingDetails) stepContext.getOptions();
+
+ bookingDetails.setTravelDate((String) stepContext.getResult());
+
+ String messageText = String.format(
+ "Please confirm, I have you traveling to: %s from: %s on: %s. Is this correct?",
+ bookingDetails.getDestination(), bookingDetails.getOrigin(), bookingDetails.getTravelDate());
+ Activity promptMessage = MessageFactory.text(messageText, messageText, InputHints.EXPECTING_INPUT);
+
+ PromptOptions promptOptions = new PromptOptions();
+ promptOptions.setPrompt(promptMessage);
+
+ return stepContext.prompt("ConfirmPrompt", promptOptions);
+ }
+
+
+ private CompletableFuture finalStep(WaterfallStepContext stepContext) {
+ if ((Boolean) stepContext.getResult()) {
+ BookingDetails bookingDetails = (BookingDetails) stepContext.getOptions();
+ return stepContext.endDialog(bookingDetails);
+ }
+
+ return stepContext.endDialog(null);
+ }
+
+ private static boolean isAmbiguous(String timex) {
+ TimexProperty timexProperty = new TimexProperty(timex);
+ return !timexProperty.getTypes().contains(Constants.TimexTypes.DEFINITE);
+ }
+}
diff --git a/generators/generators/app/templates/core/src/main/java/CancelAndHelpDialog.java b/generators/generators/app/templates/core/src/main/java/CancelAndHelpDialog.java
new file mode 100644
index 000000000..209b9b3b0
--- /dev/null
+++ b/generators/generators/app/templates/core/src/main/java/CancelAndHelpDialog.java
@@ -0,0 +1,80 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package <%= packageName %>;
+
+import com.microsoft.bot.builder.MessageFactory;
+import com.microsoft.bot.dialogs.ComponentDialog;
+import com.microsoft.bot.dialogs.DialogContext;
+import com.microsoft.bot.dialogs.DialogTurnResult;
+import com.microsoft.bot.dialogs.DialogTurnStatus;
+import com.microsoft.bot.schema.Activity;
+import com.microsoft.bot.schema.ActivityTypes;
+import com.microsoft.bot.schema.InputHints;
+
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * The class in charge of the dialog interruptions.
+ */
+public class CancelAndHelpDialog extends ComponentDialog {
+
+ private final String helpMsgText = "Show help here";
+ private final String cancelMsgText = "Cancelling...";
+
+ /**
+ * The constructor of the CancelAndHelpDialog class.
+ *
+ * @param id The dialog's Id.
+ */
+ public CancelAndHelpDialog(String id) {
+ super(id);
+ }
+
+ /**
+ * Called when the dialog is _continued_, where it is the active dialog and the user replies
+ * with a new activity.
+ *
+ * @param innerDc innerDc The inner {@link DialogContext} for the current turn of conversation.
+ * @return A {@link CompletableFuture} representing the asynchronous operation. If the task is
+ * successful, the result indicates whether the dialog is still active after the turn has been
+ * processed by the dialog. The result may also contain a return value.
+ */
+ @Override
+ protected CompletableFuture onContinueDialog(DialogContext innerDc) {
+ return interrupt(innerDc).thenCompose(result -> {
+ if (result != null) {
+ return CompletableFuture.completedFuture(result);
+ }
+ return super.onContinueDialog(innerDc);
+ });
+ }
+
+ private CompletableFuture interrupt(DialogContext innerDc) {
+ if (innerDc.getContext().getActivity().isType(ActivityTypes.MESSAGE)) {
+ String text = innerDc.getContext().getActivity().getText().toLowerCase();
+
+ switch (text) {
+ case "help":
+ case "?":
+ Activity helpMessage = MessageFactory
+ .text(helpMsgText, helpMsgText, InputHints.EXPECTING_INPUT);
+ return innerDc.getContext().sendActivity(helpMessage)
+ .thenCompose(sendResult ->
+ CompletableFuture
+ .completedFuture(new DialogTurnResult(DialogTurnStatus.WAITING)));
+ case "cancel":
+ case "quit":
+ Activity cancelMessage = MessageFactory
+ .text(cancelMsgText, cancelMsgText, InputHints.IGNORING_INPUT);
+ return innerDc.getContext()
+ .sendActivity(cancelMessage)
+ .thenCompose(sendResult -> innerDc.cancelAllDialogs());
+ default:
+ break;
+ }
+ }
+
+ return CompletableFuture.completedFuture(null);
+ }
+}
diff --git a/generators/generators/app/templates/core/src/main/java/DateResolverDialog.java b/generators/generators/app/templates/core/src/main/java/DateResolverDialog.java
new file mode 100644
index 000000000..687eb45ac
--- /dev/null
+++ b/generators/generators/app/templates/core/src/main/java/DateResolverDialog.java
@@ -0,0 +1,109 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package <%= packageName %>;
+
+import com.microsoft.bot.builder.MessageFactory;
+import com.microsoft.bot.dialogs.DialogTurnResult;
+import com.microsoft.bot.dialogs.WaterfallDialog;
+import com.microsoft.bot.dialogs.WaterfallStep;
+import com.microsoft.bot.dialogs.WaterfallStepContext;
+import com.microsoft.bot.dialogs.prompts.DateTimePrompt;
+import com.microsoft.bot.dialogs.prompts.DateTimeResolution;
+import com.microsoft.bot.dialogs.prompts.PromptOptions;
+import com.microsoft.bot.dialogs.prompts.PromptValidatorContext;
+import com.microsoft.bot.schema.Activity;
+import com.microsoft.bot.schema.InputHints;
+import com.microsoft.recognizers.datatypes.timex.expression.Constants;
+import com.microsoft.recognizers.datatypes.timex.expression.TimexProperty;
+
+import javax.annotation.Nullable;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * The class containing the date resolver dialogs.
+ */
+public class DateResolverDialog extends CancelAndHelpDialog {
+ private final String promptMsgText = "When would you like to travel?";
+ private final String repromptMsgText =
+ "I'm sorry, to make your booking please enter a full travel date including Day Month and Year.";
+
+
+ /**
+ * The constructor of the DateResolverDialog class.
+ * @param id The dialog's id.
+ */
+ public DateResolverDialog(@Nullable String id) {
+ super(id != null ? id : "DateResolverDialog");
+
+
+ addDialog(new DateTimePrompt("DateTimePrompt",
+ DateResolverDialog::dateTimePromptValidator, null));
+ WaterfallStep[] waterfallSteps = {
+ this::initialStep,
+ this::finalStep
+ };
+ addDialog(new WaterfallDialog("WaterfallDialog", Arrays.asList(waterfallSteps)));
+
+ // The initial child Dialog to run.
+ setInitialDialogId("WaterfallDialog");
+ }
+
+ private CompletableFuture initialStep(WaterfallStepContext stepContext) {
+ String timex = (String) stepContext.getOptions();
+
+ Activity promptMessage = MessageFactory.text(promptMsgText, promptMsgText, InputHints.EXPECTING_INPUT);
+ Activity repromptMessage = MessageFactory.text(repromptMsgText, repromptMsgText, InputHints.EXPECTING_INPUT);
+
+ if (timex == null) {
+ // We were not given any date at all so prompt the user.
+ PromptOptions promptOptions = new PromptOptions();
+ promptOptions.setPrompt(promptMessage);
+ promptOptions.setRetryPrompt(repromptMessage);
+ return stepContext.prompt("DateTimePrompt", promptOptions);
+ }
+
+ // We have a Date we just need to check it is unambiguous.
+ TimexProperty timexProperty = new TimexProperty(timex);
+ if (!timexProperty.getTypes().contains(Constants.TimexTypes.DEFINITE)) {
+ // This is essentially a "reprompt" of the data we were given up front.
+ PromptOptions promptOptions = new PromptOptions();
+ promptOptions.setPrompt(repromptMessage);
+ return stepContext.prompt("DateTimePrompt", promptOptions);
+ }
+
+ DateTimeResolution dateTimeResolution = new DateTimeResolution();
+ dateTimeResolution.setTimex(timex);
+ List dateTimeResolutions = new ArrayList();
+ dateTimeResolutions.add(dateTimeResolution);
+ return stepContext.next(dateTimeResolutions);
+ }
+
+ private CompletableFuture finalStep(WaterfallStepContext stepContext) {
+ String timex = ((ArrayList) stepContext.getResult()).get(0).getTimex();
+ return stepContext.endDialog(timex);
+ }
+
+ private static CompletableFuture dateTimePromptValidator(
+ PromptValidatorContext> promptContext
+ ) {
+ if (promptContext.getRecognized().getSucceeded()) {
+ // This value will be a TIMEX. And we are only interested in a Date so grab the first result and drop the
+ // Time part. TIMEX is a format that represents DateTime expressions that include some ambiguity.
+ // e.g. missing a Year.
+ String timex = ((List) promptContext.getRecognized().getValue())
+ .get(0).getTimex().split("T")[0];
+
+ // If this is a definite Date including year, month and day we are good otherwise reprompt.
+ // A better solution might be to let the user know what part is actually missing.
+ Boolean isDefinite = new TimexProperty(timex).getTypes().contains(Constants.TimexTypes.DEFINITE);
+
+ return CompletableFuture.completedFuture(isDefinite);
+ }
+
+ return CompletableFuture.completedFuture(false);
+ }
+}
diff --git a/generators/generators/app/templates/core/src/main/java/DialogAndWelcomeBot.java b/generators/generators/app/templates/core/src/main/java/DialogAndWelcomeBot.java
new file mode 100644
index 000000000..13143ced2
--- /dev/null
+++ b/generators/generators/app/templates/core/src/main/java/DialogAndWelcomeBot.java
@@ -0,0 +1,99 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package <%= packageName %>;
+
+import com.codepoetics.protonpack.collectors.CompletableFutures;
+import com.microsoft.bot.builder.ConversationState;
+import com.microsoft.bot.builder.MessageFactory;
+import com.microsoft.bot.builder.TurnContext;
+import com.microsoft.bot.builder.UserState;
+import com.microsoft.bot.dialogs.Dialog;
+import com.microsoft.bot.schema.Activity;
+import com.microsoft.bot.schema.Attachment;
+import com.microsoft.bot.schema.ChannelAccount;
+import com.microsoft.bot.schema.Serialization;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * The class containing the welcome dialog.
+ *
+ * @param is a Dialog.
+ */
+public class DialogAndWelcomeBot extends DialogBot {
+
+ /**
+ * Creates a DialogBot.
+ *
+ * @param withConversationState ConversationState to use in the bot
+ * @param withUserState UserState to use
+ * @param withDialog Param inheriting from Dialog class
+ */
+ public DialogAndWelcomeBot(
+ ConversationState withConversationState, UserState withUserState, T withDialog
+ ) {
+ super(withConversationState, withUserState, withDialog);
+ }
+
+ /**
+ * When the {@link #onConversationUpdateActivity(TurnContext)} method receives a conversation
+ * update activity that indicates one or more users other than the bot are joining the
+ * conversation, it calls this method.
+ *
+ * @param membersAdded A list of all the members added to the conversation, as described by the
+ * conversation update activity
+ * @param turnContext The context object for this turn.
+ * @return A task that represents the work queued to execute.
+ */
+ @Override
+ protected CompletableFuture onMembersAdded(
+ List membersAdded, TurnContext turnContext
+ ) {
+ return turnContext.getActivity().getMembersAdded().stream()
+ .filter(member -> !StringUtils
+ .equals(member.getId(), turnContext.getActivity().getRecipient().getId()))
+ .map(channel -> {
+ // Greet anyone that was not the target (recipient) of this message.
+ // To learn more about Adaptive Cards, see https://aka.ms/msbot-adaptivecards for more details.
+ Attachment welcomeCard = createAdaptiveCardAttachment();
+ Activity response = MessageFactory
+ .attachment(welcomeCard, null, "Welcome to Bot Framework!", null);
+
+ return turnContext.sendActivity(response).thenApply(sendResult -> {
+ return Dialog.run(getDialog(), turnContext,
+ getConversationState().createProperty("DialogState")
+ );
+ });
+ })
+ .collect(CompletableFutures.toFutureList())
+ .thenApply(resourceResponse -> null);
+ }
+
+ // Load attachment from embedded resource.
+ private Attachment createAdaptiveCardAttachment() {
+ try (
+ InputStream inputStream = Thread.currentThread().
+ getContextClassLoader().getResourceAsStream("cards/welcomeCard.json")
+ ) {
+ String adaptiveCardJson = IOUtils
+ .toString(inputStream, StandardCharsets.UTF_8.toString());
+
+ Attachment attachment = new Attachment();
+ attachment.setContentType("application/vnd.microsoft.card.adaptive");
+ attachment.setContent(Serialization.jsonToTree(adaptiveCardJson));
+ return attachment;
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ return new Attachment();
+ }
+ }
+}
diff --git a/generators/generators/app/templates/core/src/main/java/DialogBot.java b/generators/generators/app/templates/core/src/main/java/DialogBot.java
new file mode 100644
index 000000000..02b74135c
--- /dev/null
+++ b/generators/generators/app/templates/core/src/main/java/DialogBot.java
@@ -0,0 +1,127 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package <%= packageName %>;
+
+import com.microsoft.bot.builder.ActivityHandler;
+import com.microsoft.bot.builder.BotState;
+import com.microsoft.bot.builder.ConversationState;
+import com.microsoft.bot.builder.TurnContext;
+import com.microsoft.bot.builder.UserState;
+import com.microsoft.bot.dialogs.Dialog;
+import org.slf4j.LoggerFactory;
+
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * This Bot implementation can run any type of Dialog. The use of type parameterization is to allow
+ * multiple different bots to be run at different endpoints within the same project. This can be
+ * achieved by defining distinct Controller types each with dependency on distinct Bot types. The
+ * ConversationState is used by the Dialog system. The UserState isn't, however, it might have been
+ * used in a Dialog implementation, and the requirement is that all BotState objects are saved at
+ * the end of a turn.
+ *
+ * @param parameter of a type inheriting from Dialog
+ */
+public class DialogBot extends ActivityHandler {
+
+ private Dialog dialog;
+ private BotState conversationState;
+ private BotState userState;
+
+ /**
+ * Gets the dialog in use.
+ *
+ * @return instance of dialog
+ */
+ protected Dialog getDialog() {
+ return dialog;
+ }
+
+ /**
+ * Gets the conversation state.
+ *
+ * @return instance of conversationState
+ */
+ protected BotState getConversationState() {
+ return conversationState;
+ }
+
+ /**
+ * Gets the user state.
+ *
+ * @return instance of userState
+ */
+ protected BotState getUserState() {
+ return userState;
+ }
+
+ /**
+ * Sets the dialog in use.
+ *
+ * @param withDialog the dialog (of Dialog type) to be set
+ */
+ protected void setDialog(Dialog withDialog) {
+ dialog = withDialog;
+ }
+
+ /**
+ * Sets the conversation state.
+ *
+ * @param withConversationState the conversationState (of BotState type) to be set
+ */
+ protected void setConversationState(BotState withConversationState) {
+ conversationState = withConversationState;
+ }
+
+ /**
+ * Sets the user state.
+ *
+ * @param withUserState the userState (of BotState type) to be set
+ */
+ protected void setUserState(BotState withUserState) {
+ userState = withUserState;
+ }
+
+ /**
+ * Creates a DialogBot.
+ *
+ * @param withConversationState ConversationState to use in the bot
+ * @param withUserState UserState to use
+ * @param withDialog Param inheriting from Dialog class
+ */
+ public DialogBot(
+ ConversationState withConversationState, UserState withUserState, T withDialog
+ ) {
+ this.conversationState = withConversationState;
+ this.userState = withUserState;
+ this.dialog = withDialog;
+ }
+
+ /**
+ * Saves the BotState objects at the end of each turn.
+ *
+ * @param turnContext
+ * @return
+ */
+ @Override
+ public CompletableFuture onTurn(TurnContext turnContext) {
+ return super.onTurn(turnContext)
+ .thenCompose(turnResult -> conversationState.saveChanges(turnContext, false))
+ .thenCompose(saveResult -> userState.saveChanges(turnContext, false));
+ }
+
+ /**
+ * This method is executed when the turnContext receives a message activity.
+ *
+ * @param turnContext
+ * @return
+ */
+ @Override
+ protected CompletableFuture onMessageActivity(TurnContext turnContext) {
+ LoggerFactory.getLogger(DialogBot.class).info("Running dialog with Message Activity.");
+
+ // Run the Dialog with the new message Activity.
+ return Dialog.run(dialog, turnContext, conversationState.createProperty("DialogState"));
+ }
+}
diff --git a/generators/generators/app/templates/core/src/main/java/FlightBookingRecognizer.java b/generators/generators/app/templates/core/src/main/java/FlightBookingRecognizer.java
new file mode 100644
index 000000000..9d328e1b0
--- /dev/null
+++ b/generators/generators/app/templates/core/src/main/java/FlightBookingRecognizer.java
@@ -0,0 +1,153 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package <%= packageName %>;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.microsoft.bot.ai.luis.LuisApplication;
+import com.microsoft.bot.ai.luis.LuisRecognizer;
+import com.microsoft.bot.ai.luis.LuisRecognizerOptionsV3;
+import com.microsoft.bot.builder.Recognizer;
+import com.microsoft.bot.builder.RecognizerResult;
+import com.microsoft.bot.builder.TurnContext;
+import com.microsoft.bot.integration.Configuration;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * The class in charge of recognizing the booking information.
+ */
+public class FlightBookingRecognizer implements Recognizer {
+
+ private LuisRecognizer recognizer;
+
+ /**
+ * The constructor of the FlightBookingRecognizer class.
+ *
+ * @param configuration The Configuration object to use.
+ */
+ public FlightBookingRecognizer(Configuration configuration) {
+ Boolean luisIsConfigured = StringUtils.isNotBlank(configuration.getProperty("LuisAppId"))
+ && StringUtils.isNotBlank(configuration.getProperty("LuisAPIKey"))
+ && StringUtils.isNotBlank(configuration.getProperty("LuisAPIHostName"));
+ if (luisIsConfigured) {
+ LuisApplication luisApplication = new LuisApplication(
+ configuration.getProperty("LuisAppId"),
+ configuration.getProperty("LuisAPIKey"),
+ String.format("https://%s", configuration.getProperty("LuisAPIHostName"))
+ );
+ // Set the recognizer options depending on which endpoint version you want to use.
+ // More details can be found in
+ // https://docs.microsoft.com/en-gb/azure/cognitive-services/luis/luis-migration-api-v3
+ LuisRecognizerOptionsV3 recognizerOptions = new LuisRecognizerOptionsV3(luisApplication);
+ recognizerOptions.setIncludeInstanceData(true);
+
+ this.recognizer = new LuisRecognizer(recognizerOptions);
+ }
+ }
+
+ /**
+ * Verify if the recognizer is configured.
+ *
+ * @return True if it's configured, False if it's not.
+ */
+ public Boolean isConfigured() {
+ return this.recognizer != null;
+ }
+
+ /**
+ * Return an object with preformatted LUIS results for the bot's dialogs to consume.
+ *
+ * @param context A {link TurnContext}
+ * @return A {link RecognizerResult}
+ */
+ public CompletableFuture executeLuisQuery(TurnContext context) {
+ // Returns true if luis is configured in the application.properties and initialized.
+ return this.recognizer.recognize(context);
+ }
+
+ /**
+ * Gets the From data from the entities which is part of the result.
+ *
+ * @param result The recognizer result.
+ * @return The object node representing the From data.
+ */
+ public ObjectNode getFromEntities(RecognizerResult result) {
+ String fromValue = "", fromAirportValue = "";
+ if (result.getEntities().get("$instance").get("From") != null) {
+ fromValue = result.getEntities().get("$instance").get("From").get(0).get("text")
+ .asText();
+ }
+ if (!fromValue.isEmpty()
+ && result.getEntities().get("From").get(0).get("Airport") != null) {
+ fromAirportValue = result.getEntities().get("From").get(0).get("Airport").get(0).get(0)
+ .asText();
+ }
+
+ ObjectMapper mapper = new ObjectMapper().findAndRegisterModules();
+ ObjectNode entitiesNode = mapper.createObjectNode();
+ entitiesNode.put("from", fromValue);
+ entitiesNode.put("airport", fromAirportValue);
+ return entitiesNode;
+ }
+
+ /**
+ * Gets the To data from the entities which is part of the result.
+ *
+ * @param result The recognizer result.
+ * @return The object node representing the To data.
+ */
+ public ObjectNode getToEntities(RecognizerResult result) {
+ String toValue = "", toAirportValue = "";
+ if (result.getEntities().get("$instance").get("To") != null) {
+ toValue = result.getEntities().get("$instance").get("To").get(0).get("text").asText();
+ }
+ if (!toValue.isEmpty() && result.getEntities().get("To").get(0).get("Airport") != null) {
+ toAirportValue = result.getEntities().get("To").get(0).get("Airport").get(0).get(0)
+ .asText();
+ }
+
+ ObjectMapper mapper = new ObjectMapper().findAndRegisterModules();
+ ObjectNode entitiesNode = mapper.createObjectNode();
+ entitiesNode.put("to", toValue);
+ entitiesNode.put("airport", toAirportValue);
+ return entitiesNode;
+ }
+
+ /**
+ * This value will be a TIMEX. And we are only interested in a Date so grab the first result and
+ * drop the Time part. TIMEX is a format that represents DateTime expressions that include some
+ * ambiguity. e.g. missing a Year.
+ *
+ * @param result A {link RecognizerResult}
+ * @return The Timex value without the Time model
+ */
+ public String getTravelDate(RecognizerResult result) {
+ JsonNode datetimeEntity = result.getEntities().get("datetime");
+ if (datetimeEntity == null || datetimeEntity.get(0) == null) {
+ return null;
+ }
+
+ JsonNode timex = datetimeEntity.get(0).get("timex");
+ if (timex == null || timex.get(0) == null) {
+ return null;
+ }
+
+ String datetime = timex.get(0).asText().split("T")[0];
+ return datetime;
+ }
+
+ /**
+ * Runs an utterance through a recognizer and returns a generic recognizer result.
+ *
+ * @param turnContext Turn context.
+ * @return Analysis of utterance.
+ */
+ @Override
+ public CompletableFuture recognize(TurnContext turnContext) {
+ return this.recognizer.recognize(turnContext);
+ }
+}
diff --git a/generators/generators/app/templates/core/src/main/java/MainDialog.java b/generators/generators/app/templates/core/src/main/java/MainDialog.java
new file mode 100644
index 000000000..7b6cd1d8c
--- /dev/null
+++ b/generators/generators/app/templates/core/src/main/java/MainDialog.java
@@ -0,0 +1,232 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package <%= packageName %>;
+
+import com.microsoft.bot.builder.MessageFactory;
+import com.microsoft.bot.builder.TurnContext;
+import com.microsoft.bot.dialogs.ComponentDialog;
+import com.microsoft.bot.dialogs.DialogTurnResult;
+import com.microsoft.bot.dialogs.WaterfallDialog;
+import com.microsoft.bot.dialogs.WaterfallStep;
+import com.microsoft.bot.dialogs.WaterfallStepContext;
+import com.microsoft.bot.dialogs.prompts.PromptOptions;
+import com.microsoft.bot.dialogs.prompts.TextPrompt;
+import com.microsoft.bot.schema.Activity;
+import com.microsoft.bot.schema.InputHints;
+import com.microsoft.recognizers.datatypes.timex.expression.TimexProperty;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * The class containing the main dialog for the sample.
+ */
+public class MainDialog extends ComponentDialog {
+
+ private final FlightBookingRecognizer luisRecognizer;
+ private final Integer plusDayValue = 7;
+
+ /**
+ * The constructor of the Main Dialog class.
+ *
+ * @param withLuisRecognizer The FlightBookingRecognizer object.
+ * @param bookingDialog The BookingDialog object with booking dialogs.
+ */
+ public MainDialog(FlightBookingRecognizer withLuisRecognizer, BookingDialog bookingDialog) {
+ super("MainDialog");
+
+ luisRecognizer = withLuisRecognizer;
+
+ addDialog(new TextPrompt("TextPrompt"));
+ addDialog(bookingDialog);
+ WaterfallStep[] waterfallSteps = {
+ this::introStep,
+ this::actStep,
+ this::finalStep
+ };
+ addDialog(new WaterfallDialog("WaterfallDialog", Arrays.asList(waterfallSteps)));
+
+ // The initial child Dialog to run.
+ setInitialDialogId("WaterfallDialog");
+ }
+
+ /**
+ * First step in the waterfall dialog. Prompts the user for a command. Currently, this expects a
+ * booking request, like "book me a flight from Paris to Berlin on march 22" Note that the
+ * sample LUIS model will only recognize Paris, Berlin, New York and London as airport cities.
+ *
+ * @param stepContext A {@link WaterfallStepContext}
+ * @return A {@link DialogTurnResult}
+ */
+ private CompletableFuture introStep(WaterfallStepContext stepContext) {
+ if (!luisRecognizer.isConfigured()) {
+ Activity text = MessageFactory.text("NOTE: LUIS is not configured. "
+ + "To enable all capabilities, add 'LuisAppId', 'LuisAPIKey' and 'LuisAPIHostName' "
+ + "to the appsettings.json file.", null, InputHints.IGNORING_INPUT);
+ return stepContext.getContext().sendActivity(text)
+ .thenCompose(sendResult -> stepContext.next(null));
+ }
+
+ // Use the text provided in FinalStepAsync or the default if it is the first time.
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM d, yyyy");
+ String weekLaterDate = LocalDateTime.now().plusDays(plusDayValue).format(formatter);
+ String messageText = stepContext.getOptions() != null
+ ? stepContext.getOptions().toString()
+ : String.format("What can I help you with today?\n"
+ + "Say something like \"Book a flight from Paris to Berlin on %s\"", weekLaterDate);
+ Activity promptMessage = MessageFactory
+ .text(messageText, messageText, InputHints.EXPECTING_INPUT);
+ PromptOptions promptOptions = new PromptOptions();
+ promptOptions.setPrompt(promptMessage);
+ return stepContext.prompt("TextPrompt", promptOptions);
+ }
+
+ /**
+ * Second step in the waterfall. This will use LUIS to attempt to extract the origin,
+ * destination and travel dates. Then, it hands off to the bookingDialog child dialog to collect
+ * any remaining details.
+ *
+ * @param stepContext A {@link WaterfallStepContext}
+ * @return A {@link DialogTurnResult}
+ */
+ private CompletableFuture actStep(WaterfallStepContext stepContext) {
+ if (!luisRecognizer.isConfigured()) {
+ // LUIS is not configured, we just run the BookingDialog path with an empty BookingDetailsInstance.
+ return stepContext.beginDialog("BookingDialog", new BookingDetails());
+ }
+
+ // Call LUIS and gather any potential booking details. (Note the TurnContext has the response to the prompt.)
+ return luisRecognizer.recognize(stepContext.getContext()).thenCompose(luisResult -> {
+ switch (luisResult.getTopScoringIntent().intent) {
+ case "BookFlight":
+ // Extract the values for the composite entities from the LUIS result.
+ ObjectNode fromEntities = luisRecognizer.getFromEntities(luisResult);
+ ObjectNode toEntities = luisRecognizer.getToEntities(luisResult);
+
+ // Show a warning for Origin and Destination if we can't resolve them.
+ return showWarningForUnsupportedCities(
+ stepContext.getContext(), fromEntities, toEntities)
+ .thenCompose(showResult -> {
+ // Initialize BookingDetails with any entities we may have found in the response.
+
+ BookingDetails bookingDetails = new BookingDetails();
+ bookingDetails.setDestination(toEntities.get("airport").asText());
+ bookingDetails.setOrigin(fromEntities.get("airport").asText());
+ bookingDetails.setTravelDate(luisRecognizer.getTravelDate(luisResult));
+ // Run the BookingDialog giving it whatever details we have from the LUIS call,
+ // it will fill out the remainder.
+ return stepContext.beginDialog("BookingDialog", bookingDetails);
+ }
+ );
+ case "GetWeather":
+ // We haven't implemented the GetWeatherDialog so we just display a TODO message.
+ String getWeatherMessageText = "TODO: get weather flow here";
+ Activity getWeatherMessage = MessageFactory
+ .text(
+ getWeatherMessageText, getWeatherMessageText,
+ InputHints.IGNORING_INPUT
+ );
+ return stepContext.getContext().sendActivity(getWeatherMessage)
+ .thenCompose(resourceResponse -> stepContext.next(null));
+
+ default:
+ // Catch all for unhandled intents
+ String didntUnderstandMessageText = String.format(
+ "Sorry, I didn't get that. Please "
+ + " try asking in a different way (intent was %s)",
+ luisResult.getTopScoringIntent().intent
+ );
+ Activity didntUnderstandMessage = MessageFactory
+ .text(
+ didntUnderstandMessageText, didntUnderstandMessageText,
+ InputHints.IGNORING_INPUT
+ );
+ return stepContext.getContext().sendActivity(didntUnderstandMessage)
+ .thenCompose(resourceResponse -> stepContext.next(null));
+ }
+ });
+ }
+
+ /**
+ * Shows a warning if the requested From or To cities are recognized as entities but they are
+ * not in the Airport entity list. In some cases LUIS will recognize the From and To composite
+ * entities as a valid cities but the From and To Airport values will be empty if those entity
+ * values can't be mapped to a canonical item in the Airport.
+ *
+ * @param turnContext A {@link WaterfallStepContext}
+ * @param fromEntities An ObjectNode with the entities of From object
+ * @param toEntities An ObjectNode with the entities of To object
+ * @return A task
+ */
+ private static CompletableFuture showWarningForUnsupportedCities(
+ TurnContext turnContext,
+ ObjectNode fromEntities,
+ ObjectNode toEntities
+ ) {
+ List unsupportedCities = new ArrayList();
+
+ if (StringUtils.isNotBlank(fromEntities.get("from").asText())
+ && StringUtils.isBlank(fromEntities.get("airport").asText())) {
+ unsupportedCities.add(fromEntities.get("from").asText());
+ }
+
+ if (StringUtils.isNotBlank(toEntities.get("to").asText())
+ && StringUtils.isBlank(toEntities.get("airport").asText())) {
+ unsupportedCities.add(toEntities.get("to").asText());
+ }
+
+ if (!unsupportedCities.isEmpty()) {
+ String messageText = String.format(
+ "Sorry but the following airports are not supported: %s",
+ String.join(", ", unsupportedCities)
+ );
+ Activity message = MessageFactory
+ .text(messageText, messageText, InputHints.IGNORING_INPUT);
+ return turnContext.sendActivity(message)
+ .thenApply(sendResult -> null);
+ }
+
+ return CompletableFuture.completedFuture(null);
+ }
+
+ /**
+ * This is the final step in the main waterfall dialog. It wraps up the sample "book a flight"
+ * interaction with a simple confirmation.
+ *
+ * @param stepContext A {@link WaterfallStepContext}
+ * @return A {@link DialogTurnResult}
+ */
+ private CompletableFuture finalStep(WaterfallStepContext stepContext) {
+ CompletableFuture stepResult = CompletableFuture.completedFuture(null);
+
+ // If the child dialog ("BookingDialog") was cancelled,
+ // the user failed to confirm or if the intent wasn't BookFlight
+ // the Result here will be null.
+ if (stepContext.getResult() instanceof BookingDetails) {
+ // Now we have all the booking details call the booking service.
+ // If the call to the booking service was successful tell the user.
+ BookingDetails result = (BookingDetails) stepContext.getResult();
+ TimexProperty timeProperty = new TimexProperty(result.getTravelDate());
+ String travelDateMsg = timeProperty.toNaturalLanguage(LocalDateTime.now());
+ String messageText = String.format("I have you booked to %s from %s on %s",
+ result.getDestination(), result.getOrigin(), travelDateMsg
+ );
+ Activity message = MessageFactory
+ .text(messageText, messageText, InputHints.IGNORING_INPUT);
+ stepResult = stepContext.getContext().sendActivity(message).thenApply(sendResult -> null);
+ }
+
+ // Restart the main dialog with a different message the second time around
+ String promptMessage = "What else can I do for you?";
+ return stepResult
+ .thenCompose(result -> stepContext.replaceDialog(getInitialDialogId(), promptMessage));
+ }
+}
diff --git a/generators/generators/app/templates/core/src/main/java/package-info.java b/generators/generators/app/templates/core/src/main/java/package-info.java
new file mode 100644
index 000000000..1a5f44b0c
--- /dev/null
+++ b/generators/generators/app/templates/core/src/main/java/package-info.java
@@ -0,0 +1,8 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See License.txt in the project root for
+// license information.
+
+/**
+ * This package contains the classes for the core-bot sample.
+ */
+package <%= packageName %>;
diff --git a/generators/generators/app/templates/core/src/test/java/ApplicationTest.java b/generators/generators/app/templates/core/src/test/java/ApplicationTest.java
new file mode 100644
index 000000000..9b84031d4
--- /dev/null
+++ b/generators/generators/app/templates/core/src/test/java/ApplicationTest.java
@@ -0,0 +1,19 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package <%= packageName %>;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class ApplicationTest {
+
+ @Test
+ public void contextLoads() {
+ }
+
+}
diff --git a/generators/generators/app/templates/echo/project/README.md b/generators/generators/app/templates/echo/project/README.md
new file mode 100644
index 000000000..0d514610a
--- /dev/null
+++ b/generators/generators/app/templates/echo/project/README.md
@@ -0,0 +1,85 @@
+# <%= botName %>
+
+This bot has been created using [Bot Framework](https://dev.botframework.com), it shows how to create a simple bot that accepts input from the user and echoes it back.
+
+This sample is a Spring Boot app and uses the Azure CLI and azure-webapp Maven plugin to deploy to Azure.
+
+## Prerequisites
+
+- Java 1.8+
+- Install [Maven](https://maven.apache.org/)
+- An account on [Azure](https://azure.microsoft.com) if you want to deploy to Azure.
+
+## To try this sample locally
+- From the root of this project folder:
+ - Build the sample using `mvn package`
+ - Run it by using `java -jar .\target\<%= artifact %>-1.0.0.jar`
+
+- Test the bot using Bot Framework Emulator
+
+ [Bot Framework Emulator](https://github.com/microsoft/botframework-emulator) is a desktop application that allows bot developers to test and debug their bots on localhost or running remotely through a tunnel.
+
+ - Install the Bot Framework Emulator version 4.3.0 or greater from [here](https://github.com/Microsoft/BotFramework-Emulator/releases)
+
+ - Connect to the bot using Bot Framework Emulator
+
+ - Launch Bot Framework Emulator
+ - File -> Open Bot
+ - Enter a Bot URL of `http://localhost:3978/api/messages`
+
+## Deploy the bot to Azure
+
+As described on [Deploy your bot](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-deploy-az-cli), you will perform the first 4 steps to setup the Azure app, then deploy the code using the azure-webapp Maven plugin.
+
+### 1. Login to Azure
+From a command (or PowerShell) prompt in the root of the bot folder, execute:
+`az login`
+
+### 2. Set the subscription
+`az account set --subscription ""`
+
+If you aren't sure which subscription to use for deploying the bot, you can view the list of subscriptions for your account by using `az account list` command.
+
+### 3. Create an App registration
+`az ad app create --display-name "" --password "" --available-to-other-tenants`
+
+Replace `` and `` with your own values.
+
+`` is the unique name of your bot.
+`` is a minimum 16 character password for your bot.
+
+Record the `appid` from the returned JSON
+
+### 4. Create the Azure resources
+Replace the values for ``, ``, ``, and `` in the following commands:
+
+#### To a new Resource Group
+`az deployment sub create --name "echoBotDeploy" --location "westus" --template-file ".\deploymentTemplates\template-with-new-rg.json" --parameters appId="" appSecret="" botId="" botSku=S1 newAppServicePlanName="echoBotPlan" newWebAppName="echoBot" groupLocation="westus" newAppServicePlanLocation="westus"`
+
+#### To an existing Resource Group
+`az deployment group create --resource-group "" --template-file ".\deploymentTemplates\template-with-preexisting-rg.json" --parameters appId="" appSecret="" botId="" newWebAppName="echoBot" newAppServicePlanName="echoBotPlan" appServicePlanLocation="westus" --name "echoBot"`
+
+### 5. Update app id and password
+In src/main/resources/application.properties update
+- `MicrosoftAppPassword` with the botsecret value
+- `MicrosoftAppId` with the appid from the first step
+
+### 6. Deploy the code
+- Execute `mvn clean package`
+- Execute `mvn azure-webapp:deploy -Dgroupname="" -Dbotname=""`
+
+If the deployment is successful, you will be able to test it via "Test in Web Chat" from the Azure Portal using the "Bot Channel Registration" for the bot.
+
+After the bot is deployed, you only need to execute #6 if you make changes to the bot.
+
+
+## Further reading
+
+- [Maven Plugin for Azure App Service](https://docs.microsoft.com/en-us/java/api/overview/azure/maven/azure-webapp-maven-plugin/readme?view=azure-java-stable)
+- [Spring Boot](https://spring.io/projects/spring-boot)
+- [Azure for Java cloud developers](https://docs.microsoft.com/en-us/azure/java/?view=azure-java-stable)
+- [Bot Framework Documentation](https://docs.botframework.com)
+- [Bot Basics](https://docs.microsoft.com/azure/bot-service/bot-builder-basics?view=azure-bot-service-4.0)
+- [Activity processing](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-concept-activity-processing?view=azure-bot-service-4.0)
+- [Azure Bot Service Introduction](https://docs.microsoft.com/azure/bot-service/bot-service-overview-introduction?view=azure-bot-service-4.0)
+- [Azure Bot Service Documentation](https://docs.microsoft.com/azure/bot-service/?view=azure-bot-service-4.0)
diff --git a/generators/generators/app/templates/echo/project/deploymentTemplates/template-with-new-rg.json b/generators/generators/app/templates/echo/project/deploymentTemplates/template-with-new-rg.json
new file mode 100644
index 000000000..196cfb933
--- /dev/null
+++ b/generators/generators/app/templates/echo/project/deploymentTemplates/template-with-new-rg.json
@@ -0,0 +1,292 @@
+{
+ "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "groupLocation": {
+ "defaultValue": "",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the location of the Resource Group."
+ }
+ },
+ "groupName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the name of the Resource Group."
+ }
+ },
+ "appId": {
+ "type": "string",
+ "metadata": {
+ "description": "Active Directory App ID, set as MicrosoftAppId in the Web App's Application Settings."
+ }
+ },
+ "appSecret": {
+ "type": "string",
+ "metadata": {
+ "description": "Active Directory App Password, set as MicrosoftAppPassword in the Web App's Application Settings."
+ }
+ },
+ "botId": {
+ "type": "string",
+ "metadata": {
+ "description": "The globally unique and immutable bot ID. Also used to configure the displayName of the bot, which is mutable."
+ }
+ },
+ "botSku": {
+ "defaultValue": "S1",
+ "type": "string",
+ "metadata": {
+ "description": "The pricing tier of the Bot Service Registration. Acceptable values are F0 and S1."
+ }
+ },
+ "newAppServicePlanName": {
+ "defaultValue": "",
+ "type": "string",
+ "metadata": {
+ "description": "The name of the App Service Plan."
+ }
+ },
+ "newAppServicePlanSku": {
+ "type": "object",
+ "defaultValue": {
+ "name": "P1v2",
+ "tier": "PremiumV2",
+ "size": "P1v2",
+ "family": "Pv2",
+ "capacity": 1
+ },
+ "metadata": {
+ "description": "The SKU of the App Service Plan. Defaults to Standard values."
+ }
+ },
+ "newAppServicePlanLocation": {
+ "defaultValue": "",
+ "type": "string",
+ "metadata": {
+ "description": "The location of the App Service Plan. Defaults to \"westus\"."
+ }
+ },
+ "newWebAppName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The globally unique name of the Web App. Defaults to the value passed in for \"botId\"."
+ }
+ }
+ },
+ "variables": {
+ "appServicePlanName": "[parameters('newAppServicePlanName')]",
+ "resourcesLocation": "[parameters('newAppServicePlanLocation')]",
+ "webAppName": "[if(empty(parameters('newWebAppName')), parameters('botId'), parameters('newWebAppName'))]",
+ "siteHost": "[concat(variables('webAppName'), '.azurewebsites.net')]",
+ "botEndpoint": "[concat('https://', variables('siteHost'), '/api/messages')]",
+ "publishingUsername": "[concat('$', parameters('newWebAppName'))]",
+ "resourceGroupId": "[concat(subscription().id, '/resourceGroups/', parameters('groupName'))]"
+ },
+ "resources": [
+ {
+ "name": "[parameters('groupName')]",
+ "type": "Microsoft.Resources/resourceGroups",
+ "apiVersion": "2018-05-01",
+ "location": "[parameters('groupLocation')]",
+ "properties": {}
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2018-05-01",
+ "name": "storageDeployment",
+ "resourceGroup": "[parameters('groupName')]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Resources/resourceGroups/', parameters('groupName'))]"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "template": {
+ "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {},
+ "variables": {},
+ "resources": [
+ {
+ "comments": "Create a new Linux App Service Plan if no existing App Service Plan name was passed in.",
+ "type": "Microsoft.Web/serverfarms",
+ "name": "[variables('appServicePlanName')]",
+ "apiVersion": "2018-02-01",
+ "location": "[variables('resourcesLocation')]",
+ "sku": "[parameters('newAppServicePlanSku')]",
+ "kind": "linux",
+ "properties": {
+ "perSiteScaling": false,
+ "maximumElasticWorkerCount": 1,
+ "isSpot": false,
+ "reserved": true,
+ "isXenon": false,
+ "hyperV": false,
+ "targetWorkerCount": 0,
+ "targetWorkerSizeId": 0
+ }
+ },
+ {
+ "comments": "Create a Web App using a Linux App Service Plan",
+ "type": "Microsoft.Web/sites",
+ "apiVersion": "2018-11-01",
+ "location": "[variables('resourcesLocation')]",
+ "kind": "app,linux",
+ "dependsOn": [
+ "[concat(variables('resourceGroupId'), '/providers/Microsoft.Web/serverfarms/', variables('appServicePlanName'))]"
+ ],
+ "name": "[variables('webAppName')]",
+ "properties": {
+ "name": "[variables('webAppName')]",
+ "hostNameSslStates": [
+ {
+ "name": "[concat(parameters('newWebAppName'), '.azurewebsites.net')]",
+ "sslState": "Disabled",
+ "hostType": "Standard"
+ },
+ {
+ "name": "[concat(parameters('newWebAppName'), '.scm.azurewebsites.net')]",
+ "sslState": "Disabled",
+ "hostType": "Repository"
+ }
+ ],
+ "serverFarmId": "[variables('appServicePlanName')]",
+ "reserved": true,
+ "isXenon": false,
+ "hyperV": false,
+ "scmSiteAlsoStopped": false,
+ "clientAffinityEnabled": true,
+ "clientCertEnabled": false,
+ "hostNamesDisabled": false,
+ "containerSize": 0,
+ "dailyMemoryTimeQuota": 0,
+ "httpsOnly": false,
+ "redundancyMode": "None",
+ "siteConfig": {
+ "appSettings": [
+ {
+ "name": "JAVA_OPTS",
+ "value": "-Dserver.port=80"
+ },
+ {
+ "name": "MicrosoftAppId",
+ "value": "[parameters('appId')]"
+ },
+ {
+ "name": "MicrosoftAppPassword",
+ "value": "[parameters('appSecret')]"
+ }
+ ],
+ "cors": {
+ "allowedOrigins": [
+ "https://botservice.hosting.portal.azure.net",
+ "https://hosting.onecloud.azure-test.net/"
+ ]
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Web/sites/config",
+ "apiVersion": "2018-11-01",
+ "name": "[concat(variables('webAppName'), '/web')]",
+ "location": "[variables('resourcesLocation')]",
+ "dependsOn": [
+ "[concat(variables('resourceGroupId'), '/providers/Microsoft.Web/sites/', variables('webAppName'))]"
+ ],
+ "properties": {
+ "numberOfWorkers": 1,
+ "defaultDocuments": [
+ "Default.htm",
+ "Default.html",
+ "Default.asp",
+ "index.htm",
+ "index.html",
+ "iisstart.htm",
+ "default.aspx",
+ "index.php",
+ "hostingstart.html"
+ ],
+ "netFrameworkVersion": "v4.0",
+ "linuxFxVersion": "JAVA|8-jre8",
+ "requestTracingEnabled": false,
+ "remoteDebuggingEnabled": false,
+ "httpLoggingEnabled": false,
+ "logsDirectorySizeLimit": 35,
+ "detailedErrorLoggingEnabled": false,
+ "publishingUsername": "[variables('publishingUsername')]",
+ "scmType": "None",
+ "use32BitWorkerProcess": true,
+ "webSocketsEnabled": false,
+ "alwaysOn": true,
+ "managedPipelineMode": "Integrated",
+ "virtualApplications": [
+ {
+ "virtualPath": "/",
+ "physicalPath": "site\\wwwroot",
+ "preloadEnabled": true
+ }
+ ],
+ "loadBalancing": "LeastRequests",
+ "experiments": {
+ "rampUpRules": []
+ },
+ "autoHealEnabled": false,
+ "localMySqlEnabled": false,
+ "ipSecurityRestrictions": [
+ {
+ "ipAddress": "Any",
+ "action": "Allow",
+ "priority": 1,
+ "name": "Allow all",
+ "description": "Allow all access"
+ }
+ ],
+ "scmIpSecurityRestrictions": [
+ {
+ "ipAddress": "Any",
+ "action": "Allow",
+ "priority": 1,
+ "name": "Allow all",
+ "description": "Allow all access"
+ }
+ ],
+ "scmIpSecurityRestrictionsUseMain": false,
+ "http20Enabled": false,
+ "minTlsVersion": "1.2",
+ "ftpsState": "AllAllowed",
+ "reservedInstanceCount": 0
+ }
+ },
+ {
+ "apiVersion": "2021-03-01",
+ "type": "Microsoft.BotService/botServices",
+ "name": "[parameters('botId')]",
+ "location": "global",
+ "kind": "azurebot",
+ "sku": {
+ "name": "[parameters('botSku')]"
+ },
+ "properties": {
+ "name": "[parameters('botId')]",
+ "displayName": "[parameters('botId')]",
+ "iconUrl": "https://docs.botframework.com/static/devportal/client/images/bot-framework-default.png",
+ "endpoint": "[variables('botEndpoint')]",
+ "msaAppId": "[parameters('appId')]",
+ "luisAppIds": [],
+ "schemaTransformationVersion": "1.3",
+ "isCmekEnabled": false,
+ "isIsolated": false
+ },
+ "dependsOn": [
+ "[concat(variables('resourceGroupId'), '/providers/Microsoft.Web/sites/', variables('webAppName'))]"
+ ]
+ }
+ ],
+ "outputs": {}
+ }
+ }
+ }
+ ]
+}
diff --git a/generators/generators/app/templates/echo/project/deploymentTemplates/template-with-preexisting-rg.json b/generators/generators/app/templates/echo/project/deploymentTemplates/template-with-preexisting-rg.json
new file mode 100644
index 000000000..d6feb0a0f
--- /dev/null
+++ b/generators/generators/app/templates/echo/project/deploymentTemplates/template-with-preexisting-rg.json
@@ -0,0 +1,260 @@
+{
+ "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "appId": {
+ "type": "string",
+ "metadata": {
+ "description": "Active Directory App ID, set as MicrosoftAppId in the Web App's Application Settings."
+ }
+ },
+ "appSecret": {
+ "type": "string",
+ "metadata": {
+ "description": "Active Directory App Password, set as MicrosoftAppPassword in the Web App's Application Settings. Defaults to \"\"."
+ }
+ },
+ "botId": {
+ "type": "string",
+ "metadata": {
+ "description": "The globally unique and immutable bot ID. Also used to configure the displayName of the bot, which is mutable."
+ }
+ },
+ "botSku": {
+ "defaultValue": "S1",
+ "type": "string",
+ "metadata": {
+ "description": "The pricing tier of the Bot Service Registration. Acceptable values are F0 and S1."
+ }
+ },
+ "newAppServicePlanName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The name of the new App Service Plan."
+ }
+ },
+ "newAppServicePlanSku": {
+ "type": "object",
+ "defaultValue": {
+ "name": "P1v2",
+ "tier": "PremiumV2",
+ "size": "P1v2",
+ "family": "Pv2",
+ "capacity": 1
+ },
+ "metadata": {
+ "description": "The SKU of the App Service Plan. Defaults to Standard values."
+ }
+ },
+ "appServicePlanLocation": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The location of the App Service Plan."
+ }
+ },
+ "existingAppServicePlan": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Name of the existing App Service Plan used to create the Web App for the bot."
+ }
+ },
+ "newWebAppName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The globally unique name of the Web App. Defaults to the value passed in for \"botId\"."
+ }
+ }
+ },
+ "variables": {
+ "defaultAppServicePlanName": "[if(empty(parameters('existingAppServicePlan')), 'createNewAppServicePlan', parameters('existingAppServicePlan'))]",
+ "useExistingAppServicePlan": "[not(equals(variables('defaultAppServicePlanName'), 'createNewAppServicePlan'))]",
+ "servicePlanName": "[if(variables('useExistingAppServicePlan'), parameters('existingAppServicePlan'), parameters('newAppServicePlanName'))]",
+ "publishingUsername": "[concat('$', parameters('newWebAppName'))]",
+ "resourcesLocation": "[parameters('appServicePlanLocation')]",
+ "webAppName": "[if(empty(parameters('newWebAppName')), parameters('botId'), parameters('newWebAppName'))]",
+ "siteHost": "[concat(variables('webAppName'), '.azurewebsites.net')]",
+ "botEndpoint": "[concat('https://', variables('siteHost'), '/api/messages')]"
+ },
+ "resources": [
+ {
+ "comments": "Create a new Linux App Service Plan if no existing App Service Plan name was passed in.",
+ "type": "Microsoft.Web/serverfarms",
+ "condition": "[not(variables('useExistingAppServicePlan'))]",
+ "name": "[variables('servicePlanName')]",
+ "apiVersion": "2018-02-01",
+ "location": "[variables('resourcesLocation')]",
+ "sku": "[parameters('newAppServicePlanSku')]",
+ "kind": "linux",
+ "properties": {
+ "perSiteScaling": false,
+ "maximumElasticWorkerCount": 1,
+ "isSpot": false,
+ "reserved": true,
+ "isXenon": false,
+ "hyperV": false,
+ "targetWorkerCount": 0,
+ "targetWorkerSizeId": 0
+ }
+ },
+ {
+ "comments": "Create a Web App using a Linux App Service Plan",
+ "type": "Microsoft.Web/sites",
+ "apiVersion": "2018-11-01",
+ "location": "[variables('resourcesLocation')]",
+ "kind": "app,linux",
+ "dependsOn": [
+ "[resourceId('Microsoft.Web/serverfarms', variables('servicePlanName'))]"
+ ],
+ "name": "[variables('webAppName')]",
+ "properties": {
+ "name": "[variables('webAppName')]",
+ "hostNameSslStates": [
+ {
+ "name": "[concat(parameters('newWebAppName'), '.azurewebsites.net')]",
+ "sslState": "Disabled",
+ "hostType": "Standard"
+ },
+ {
+ "name": "[concat(parameters('newWebAppName'), '.scm.azurewebsites.net')]",
+ "sslState": "Disabled",
+ "hostType": "Repository"
+ }
+ ],
+ "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('servicePlanName'))]",
+ "reserved": true,
+ "isXenon": false,
+ "hyperV": false,
+ "scmSiteAlsoStopped": false,
+ "clientAffinityEnabled": true,
+ "clientCertEnabled": false,
+ "hostNamesDisabled": false,
+ "containerSize": 0,
+ "dailyMemoryTimeQuota": 0,
+ "httpsOnly": false,
+ "redundancyMode": "None",
+ "siteConfig": {
+ "appSettings": [
+ {
+ "name": "JAVA_OPTS",
+ "value": "-Dserver.port=80"
+ },
+ {
+ "name": "MicrosoftAppId",
+ "value": "[parameters('appId')]"
+ },
+ {
+ "name": "MicrosoftAppPassword",
+ "value": "[parameters('appSecret')]"
+ }
+ ],
+ "cors": {
+ "allowedOrigins": [
+ "https://botservice.hosting.portal.azure.net",
+ "https://hosting.onecloud.azure-test.net/"
+ ]
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Web/sites/config",
+ "apiVersion": "2018-11-01",
+ "name": "[concat(variables('webAppName'), '/web')]",
+ "location": "[variables('resourcesLocation')]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Web/sites/', variables('webAppName'))]"
+ ],
+ "properties": {
+ "numberOfWorkers": 1,
+ "defaultDocuments": [
+ "Default.htm",
+ "Default.html",
+ "Default.asp",
+ "index.htm",
+ "index.html",
+ "iisstart.htm",
+ "default.aspx",
+ "index.php",
+ "hostingstart.html"
+ ],
+ "netFrameworkVersion": "v4.0",
+ "linuxFxVersion": "JAVA|8-jre8",
+ "requestTracingEnabled": false,
+ "remoteDebuggingEnabled": false,
+ "httpLoggingEnabled": false,
+ "logsDirectorySizeLimit": 35,
+ "detailedErrorLoggingEnabled": false,
+ "publishingUsername": "[variables('publishingUsername')]",
+ "scmType": "None",
+ "use32BitWorkerProcess": true,
+ "webSocketsEnabled": false,
+ "alwaysOn": true,
+ "managedPipelineMode": "Integrated",
+ "virtualApplications": [
+ {
+ "virtualPath": "/",
+ "physicalPath": "site\\wwwroot",
+ "preloadEnabled": true
+ }
+ ],
+ "loadBalancing": "LeastRequests",
+ "experiments": {
+ "rampUpRules": []
+ },
+ "autoHealEnabled": false,
+ "localMySqlEnabled": false,
+ "ipSecurityRestrictions": [
+ {
+ "ipAddress": "Any",
+ "action": "Allow",
+ "priority": 1,
+ "name": "Allow all",
+ "description": "Allow all access"
+ }
+ ],
+ "scmIpSecurityRestrictions": [
+ {
+ "ipAddress": "Any",
+ "action": "Allow",
+ "priority": 1,
+ "name": "Allow all",
+ "description": "Allow all access"
+ }
+ ],
+ "scmIpSecurityRestrictionsUseMain": false,
+ "http20Enabled": false,
+ "minTlsVersion": "1.2",
+ "ftpsState": "AllAllowed",
+ "reservedInstanceCount": 0
+ }
+ },
+ {
+ "apiVersion": "2021-03-01",
+ "type": "Microsoft.BotService/botServices",
+ "name": "[parameters('botId')]",
+ "location": "global",
+ "kind": "azurebot",
+ "sku": {
+ "name": "[parameters('botSku')]"
+ },
+ "properties": {
+ "name": "[parameters('botId')]",
+ "displayName": "[parameters('botId')]",
+ "iconUrl": "https://docs.botframework.com/static/devportal/client/images/bot-framework-default.png",
+ "endpoint": "[variables('botEndpoint')]",
+ "msaAppId": "[parameters('appId')]",
+ "luisAppIds": [],
+ "schemaTransformationVersion": "1.3",
+ "isCmekEnabled": false,
+ "isIsolated": false
+ },
+ "dependsOn": [
+ "[resourceId('Microsoft.Web/sites/', variables('webAppName'))]"
+ ]
+ }
+ ]
+}
diff --git a/generators/generators/app/templates/echo/project/pom.xml b/generators/generators/app/templates/echo/project/pom.xml
new file mode 100644
index 000000000..2e9fe1986
--- /dev/null
+++ b/generators/generators/app/templates/echo/project/pom.xml
@@ -0,0 +1,259 @@
+
+
+
+ 4.0.0
+
+ <%= packageName %>
+ <%= artifact %>
+ 1.0.0
+ jar
+
+ ${project.groupId}:${project.artifactId}
+ This package contains a Java Bot Echo.
+ http://maven.apache.org
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.4.0
+
+
+
+
+ 1.8
+ 1.8
+ 1.8
+ <%= packageName %>.Application
+ https://botbuilder.myget.org/F/botbuilder-v4-java-daily/maven/
+
+
+
+
+ junit
+ junit
+ 4.13.1
+ test
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ 2.4.0
+ test
+
+
+ org.junit.vintage
+ junit-vintage-engine
+ test
+
+
+
+ org.slf4j
+ slf4j-api
+
+
+ org.apache.logging.log4j
+ log4j-api
+ 2.17.1
+
+
+ org.apache.logging.log4j
+ log4j-core
+ 2.17.1
+
+
+ org.apache.logging.log4j
+ log4j-to-slf4j
+ 2.15.0
+ test
+
+
+
+ com.microsoft.bot
+ bot-integration-spring
+ 4.14.1
+ compile
+
+
+
+
+
+ MyGet
+ ${repo.url}
+
+
+
+
+
+ ossrh
+
+ https://oss.sonatype.org/
+
+
+
+
+
+
+ build
+
+ true
+
+
+
+
+ src/main/resources
+ false
+
+
+
+
+
+ maven-compiler-plugin
+ 3.8.1
+
+ 1.8
+ 1.8
+
+
+
+ maven-war-plugin
+ 3.2.3
+
+ src/main/webapp
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ repackage
+
+
+ <%= packageName %>.Application
+
+
+
+
+
+ com.microsoft.azure
+ azure-webapp-maven-plugin
+ 1.7.0
+
+ V2
+ ${groupname}
+ ${botname}
+
+
+ JAVA_OPTS
+ -Dserver.port=80
+
+
+
+ linux
+ jre8
+ jre8
+
+
+
+
+ ${project.basedir}/target
+
+ *.jar
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-site-plugin
+ 3.7.1
+
+
+ org.apache.maven.plugins
+ maven-project-info-reports-plugin
+ 3.0.0
+
+
+
+
+
+
+
+ publish
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+
+ org.sonatype.plugins
+ nexus-staging-maven-plugin
+ 1.6.8
+ true
+
+ true
+ ossrh
+ https://oss.sonatype.org/
+ true
+
+
+
+
+ org.apache.maven.plugins
+ maven-gpg-plugin
+
+
+ sign-artifacts
+ verify
+
+ sign
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+
+ 8
+ false
+
+
+
+ attach-javadocs
+
+ jar
+
+
+
+
+
+
+
+
+
diff --git a/generators/generators/app/templates/echo/project/src/main/resources/application.properties b/generators/generators/app/templates/echo/project/src/main/resources/application.properties
new file mode 100644
index 000000000..d7d0ee864
--- /dev/null
+++ b/generators/generators/app/templates/echo/project/src/main/resources/application.properties
@@ -0,0 +1,3 @@
+MicrosoftAppId=
+MicrosoftAppPassword=
+server.port=3978
diff --git a/generators/generators/app/templates/echo/project/src/main/resources/log4j2.json b/generators/generators/app/templates/echo/project/src/main/resources/log4j2.json
new file mode 100644
index 000000000..ad838e77f
--- /dev/null
+++ b/generators/generators/app/templates/echo/project/src/main/resources/log4j2.json
@@ -0,0 +1,21 @@
+{
+ "configuration": {
+ "name": "Default",
+ "appenders": {
+ "Console": {
+ "name": "Console-Appender",
+ "target": "SYSTEM_OUT",
+ "PatternLayout": {
+ "pattern":
+ "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"
+ }
+ }
+ },
+ "loggers": {
+ "root": {
+ "level": "debug",
+ "appender-ref": { "ref": "Console-Appender", "level": "debug" }
+ }
+ }
+ }
+}
diff --git a/generators/generators/app/templates/echo/project/src/main/webapp/META-INF/MANIFEST.MF b/generators/generators/app/templates/echo/project/src/main/webapp/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..254272e1c
--- /dev/null
+++ b/generators/generators/app/templates/echo/project/src/main/webapp/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Class-Path:
+
diff --git a/generators/generators/app/templates/echo/project/src/main/webapp/WEB-INF/web.xml b/generators/generators/app/templates/echo/project/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 000000000..383c19004
--- /dev/null
+++ b/generators/generators/app/templates/echo/project/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,12 @@
+
+
+ dispatcher
+
+ org.springframework.web.servlet.DispatcherServlet
+
+
+ contextConfigLocation
+ /WEB-INF/spring/dispatcher-config.xml
+
+ 1
+
\ No newline at end of file
diff --git a/generators/generators/app/templates/echo/project/src/main/webapp/index.html b/generators/generators/app/templates/echo/project/src/main/webapp/index.html
new file mode 100644
index 000000000..1b10a9051
--- /dev/null
+++ b/generators/generators/app/templates/echo/project/src/main/webapp/index.html
@@ -0,0 +1,418 @@
+
+
+
+
+
+
+ <%= botName %>
+
+
+
+
+
+
+
+
+
Your bot is ready!
+
You can test your bot in the Bot Framework Emulator
+ by connecting to http://localhost:3978/api/messages.
+
+
Visit
Azure
+ Bot Service to register your bot and add it to
+ various channels. The bot's endpoint URL typically looks
+ like this:
+
https://your_bots_hostname /api/messages
+
+
+
+
+
+
+
diff --git a/generators/generators/app/templates/echo/src/main/java/Application.java b/generators/generators/app/templates/echo/src/main/java/Application.java
new file mode 100644
index 000000000..001ead194
--- /dev/null
+++ b/generators/generators/app/templates/echo/src/main/java/Application.java
@@ -0,0 +1,65 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package <%= packageName %>;
+
+import com.microsoft.bot.builder.Bot;
+import com.microsoft.bot.integration.AdapterWithErrorHandler;
+import com.microsoft.bot.integration.BotFrameworkHttpAdapter;
+import com.microsoft.bot.integration.Configuration;
+import com.microsoft.bot.integration.spring.BotController;
+import com.microsoft.bot.integration.spring.BotDependencyConfiguration;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Import;
+
+//
+// This is the starting point of the Sprint Boot Bot application.
+//
+@SpringBootApplication
+
+// Use the default BotController to receive incoming Channel messages. A custom
+// controller could be used by eliminating this import and creating a new
+// org.springframework.web.bind.annotation.RestController.
+// The default controller is created by the Spring Boot container using
+// dependency injection. The default route is /api/messages.
+@Import({BotController.class})
+
+/**
+ * This class extends the BotDependencyConfiguration which provides the default
+ * implementations for a Bot application. The Application class should
+ * override methods in order to provide custom implementations.
+ */
+public class Application extends BotDependencyConfiguration {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+ /**
+ * Returns the Bot for this application.
+ *
+ *
+ * The @Component annotation could be used on the Bot class instead of this method
+ * with the @Bean annotation.
+ *
+ *
+ * @return The Bot implementation for this application.
+ */
+ @Bean
+ public Bot getBot() {
+ return new EchoBot();
+ }
+
+ /**
+ * Returns a custom Adapter that provides error handling.
+ *
+ * @param configuration The Configuration object to use.
+ * @return An error handling BotFrameworkHttpAdapter.
+ */
+ @Override
+ public BotFrameworkHttpAdapter getBotFrameworkHttpAdaptor(Configuration configuration) {
+ return new AdapterWithErrorHandler(configuration);
+ }
+}
diff --git a/generators/generators/app/templates/echo/src/main/java/EchoBot.java b/generators/generators/app/templates/echo/src/main/java/EchoBot.java
new file mode 100644
index 000000000..9a474ab44
--- /dev/null
+++ b/generators/generators/app/templates/echo/src/main/java/EchoBot.java
@@ -0,0 +1,46 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package <%= packageName %>;
+
+import com.codepoetics.protonpack.collectors.CompletableFutures;
+import com.microsoft.bot.builder.ActivityHandler;
+import com.microsoft.bot.builder.MessageFactory;
+import com.microsoft.bot.builder.TurnContext;
+import com.microsoft.bot.schema.ChannelAccount;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * This class implements the functionality of the Bot.
+ *
+ *
+ * This is where application specific logic for interacting with the users would be added. For this
+ * sample, the {@link #onMessageActivity(TurnContext)} echos the text back to the user. The {@link
+ * #onMembersAdded(List, TurnContext)} will send a greeting to new conversation participants.
+ *
+ */
+public class EchoBot extends ActivityHandler {
+
+ @Override
+ protected CompletableFuture onMessageActivity(TurnContext turnContext) {
+ return turnContext.sendActivity(
+ MessageFactory.text("Echo: " + turnContext.getActivity().getText())
+ ).thenApply(sendResult -> null);
+ }
+
+ @Override
+ protected CompletableFuture onMembersAdded(
+ List membersAdded,
+ TurnContext turnContext
+ ) {
+ return membersAdded.stream()
+ .filter(
+ member -> !StringUtils
+ .equals(member.getId(), turnContext.getActivity().getRecipient().getId())
+ ).map(channel -> turnContext.sendActivity(MessageFactory.text("Hello and welcome!")))
+ .collect(CompletableFutures.toFutureList()).thenApply(resourceResponses -> null);
+ }
+}
diff --git a/generators/generators/app/templates/echo/src/test/java/ApplicationTests.java b/generators/generators/app/templates/echo/src/test/java/ApplicationTests.java
new file mode 100644
index 000000000..37084390c
--- /dev/null
+++ b/generators/generators/app/templates/echo/src/test/java/ApplicationTests.java
@@ -0,0 +1,19 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package <%= packageName %>;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class ApplicationTests {
+
+ @Test
+ public void contextLoads() {
+ }
+
+}
diff --git a/generators/generators/app/templates/empty/project/README.md b/generators/generators/app/templates/empty/project/README.md
new file mode 100644
index 000000000..0d514610a
--- /dev/null
+++ b/generators/generators/app/templates/empty/project/README.md
@@ -0,0 +1,85 @@
+# <%= botName %>
+
+This bot has been created using [Bot Framework](https://dev.botframework.com), it shows how to create a simple bot that accepts input from the user and echoes it back.
+
+This sample is a Spring Boot app and uses the Azure CLI and azure-webapp Maven plugin to deploy to Azure.
+
+## Prerequisites
+
+- Java 1.8+
+- Install [Maven](https://maven.apache.org/)
+- An account on [Azure](https://azure.microsoft.com) if you want to deploy to Azure.
+
+## To try this sample locally
+- From the root of this project folder:
+ - Build the sample using `mvn package`
+ - Run it by using `java -jar .\target\<%= artifact %>-1.0.0.jar`
+
+- Test the bot using Bot Framework Emulator
+
+ [Bot Framework Emulator](https://github.com/microsoft/botframework-emulator) is a desktop application that allows bot developers to test and debug their bots on localhost or running remotely through a tunnel.
+
+ - Install the Bot Framework Emulator version 4.3.0 or greater from [here](https://github.com/Microsoft/BotFramework-Emulator/releases)
+
+ - Connect to the bot using Bot Framework Emulator
+
+ - Launch Bot Framework Emulator
+ - File -> Open Bot
+ - Enter a Bot URL of `http://localhost:3978/api/messages`
+
+## Deploy the bot to Azure
+
+As described on [Deploy your bot](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-deploy-az-cli), you will perform the first 4 steps to setup the Azure app, then deploy the code using the azure-webapp Maven plugin.
+
+### 1. Login to Azure
+From a command (or PowerShell) prompt in the root of the bot folder, execute:
+`az login`
+
+### 2. Set the subscription
+`az account set --subscription ""`
+
+If you aren't sure which subscription to use for deploying the bot, you can view the list of subscriptions for your account by using `az account list` command.
+
+### 3. Create an App registration
+`az ad app create --display-name "" --password "" --available-to-other-tenants`
+
+Replace `` and `` with your own values.
+
+`` is the unique name of your bot.
+`` is a minimum 16 character password for your bot.
+
+Record the `appid` from the returned JSON
+
+### 4. Create the Azure resources
+Replace the values for ``, ``, ``, and `` in the following commands:
+
+#### To a new Resource Group
+`az deployment sub create --name "echoBotDeploy" --location "westus" --template-file ".\deploymentTemplates\template-with-new-rg.json" --parameters appId="" appSecret="" botId="" botSku=S1 newAppServicePlanName="echoBotPlan" newWebAppName="echoBot" groupLocation="westus" newAppServicePlanLocation="westus"`
+
+#### To an existing Resource Group
+`az deployment group create --resource-group "" --template-file ".\deploymentTemplates\template-with-preexisting-rg.json" --parameters appId="" appSecret="" botId="" newWebAppName="echoBot" newAppServicePlanName="echoBotPlan" appServicePlanLocation="westus" --name "echoBot"`
+
+### 5. Update app id and password
+In src/main/resources/application.properties update
+- `MicrosoftAppPassword` with the botsecret value
+- `MicrosoftAppId` with the appid from the first step
+
+### 6. Deploy the code
+- Execute `mvn clean package`
+- Execute `mvn azure-webapp:deploy -Dgroupname="" -Dbotname=""`
+
+If the deployment is successful, you will be able to test it via "Test in Web Chat" from the Azure Portal using the "Bot Channel Registration" for the bot.
+
+After the bot is deployed, you only need to execute #6 if you make changes to the bot.
+
+
+## Further reading
+
+- [Maven Plugin for Azure App Service](https://docs.microsoft.com/en-us/java/api/overview/azure/maven/azure-webapp-maven-plugin/readme?view=azure-java-stable)
+- [Spring Boot](https://spring.io/projects/spring-boot)
+- [Azure for Java cloud developers](https://docs.microsoft.com/en-us/azure/java/?view=azure-java-stable)
+- [Bot Framework Documentation](https://docs.botframework.com)
+- [Bot Basics](https://docs.microsoft.com/azure/bot-service/bot-builder-basics?view=azure-bot-service-4.0)
+- [Activity processing](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-concept-activity-processing?view=azure-bot-service-4.0)
+- [Azure Bot Service Introduction](https://docs.microsoft.com/azure/bot-service/bot-service-overview-introduction?view=azure-bot-service-4.0)
+- [Azure Bot Service Documentation](https://docs.microsoft.com/azure/bot-service/?view=azure-bot-service-4.0)
diff --git a/generators/generators/app/templates/empty/project/deploymentTemplates/template-with-new-rg.json b/generators/generators/app/templates/empty/project/deploymentTemplates/template-with-new-rg.json
new file mode 100644
index 000000000..196cfb933
--- /dev/null
+++ b/generators/generators/app/templates/empty/project/deploymentTemplates/template-with-new-rg.json
@@ -0,0 +1,292 @@
+{
+ "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "groupLocation": {
+ "defaultValue": "",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the location of the Resource Group."
+ }
+ },
+ "groupName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the name of the Resource Group."
+ }
+ },
+ "appId": {
+ "type": "string",
+ "metadata": {
+ "description": "Active Directory App ID, set as MicrosoftAppId in the Web App's Application Settings."
+ }
+ },
+ "appSecret": {
+ "type": "string",
+ "metadata": {
+ "description": "Active Directory App Password, set as MicrosoftAppPassword in the Web App's Application Settings."
+ }
+ },
+ "botId": {
+ "type": "string",
+ "metadata": {
+ "description": "The globally unique and immutable bot ID. Also used to configure the displayName of the bot, which is mutable."
+ }
+ },
+ "botSku": {
+ "defaultValue": "S1",
+ "type": "string",
+ "metadata": {
+ "description": "The pricing tier of the Bot Service Registration. Acceptable values are F0 and S1."
+ }
+ },
+ "newAppServicePlanName": {
+ "defaultValue": "",
+ "type": "string",
+ "metadata": {
+ "description": "The name of the App Service Plan."
+ }
+ },
+ "newAppServicePlanSku": {
+ "type": "object",
+ "defaultValue": {
+ "name": "P1v2",
+ "tier": "PremiumV2",
+ "size": "P1v2",
+ "family": "Pv2",
+ "capacity": 1
+ },
+ "metadata": {
+ "description": "The SKU of the App Service Plan. Defaults to Standard values."
+ }
+ },
+ "newAppServicePlanLocation": {
+ "defaultValue": "",
+ "type": "string",
+ "metadata": {
+ "description": "The location of the App Service Plan. Defaults to \"westus\"."
+ }
+ },
+ "newWebAppName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The globally unique name of the Web App. Defaults to the value passed in for \"botId\"."
+ }
+ }
+ },
+ "variables": {
+ "appServicePlanName": "[parameters('newAppServicePlanName')]",
+ "resourcesLocation": "[parameters('newAppServicePlanLocation')]",
+ "webAppName": "[if(empty(parameters('newWebAppName')), parameters('botId'), parameters('newWebAppName'))]",
+ "siteHost": "[concat(variables('webAppName'), '.azurewebsites.net')]",
+ "botEndpoint": "[concat('https://', variables('siteHost'), '/api/messages')]",
+ "publishingUsername": "[concat('$', parameters('newWebAppName'))]",
+ "resourceGroupId": "[concat(subscription().id, '/resourceGroups/', parameters('groupName'))]"
+ },
+ "resources": [
+ {
+ "name": "[parameters('groupName')]",
+ "type": "Microsoft.Resources/resourceGroups",
+ "apiVersion": "2018-05-01",
+ "location": "[parameters('groupLocation')]",
+ "properties": {}
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2018-05-01",
+ "name": "storageDeployment",
+ "resourceGroup": "[parameters('groupName')]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Resources/resourceGroups/', parameters('groupName'))]"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "template": {
+ "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {},
+ "variables": {},
+ "resources": [
+ {
+ "comments": "Create a new Linux App Service Plan if no existing App Service Plan name was passed in.",
+ "type": "Microsoft.Web/serverfarms",
+ "name": "[variables('appServicePlanName')]",
+ "apiVersion": "2018-02-01",
+ "location": "[variables('resourcesLocation')]",
+ "sku": "[parameters('newAppServicePlanSku')]",
+ "kind": "linux",
+ "properties": {
+ "perSiteScaling": false,
+ "maximumElasticWorkerCount": 1,
+ "isSpot": false,
+ "reserved": true,
+ "isXenon": false,
+ "hyperV": false,
+ "targetWorkerCount": 0,
+ "targetWorkerSizeId": 0
+ }
+ },
+ {
+ "comments": "Create a Web App using a Linux App Service Plan",
+ "type": "Microsoft.Web/sites",
+ "apiVersion": "2018-11-01",
+ "location": "[variables('resourcesLocation')]",
+ "kind": "app,linux",
+ "dependsOn": [
+ "[concat(variables('resourceGroupId'), '/providers/Microsoft.Web/serverfarms/', variables('appServicePlanName'))]"
+ ],
+ "name": "[variables('webAppName')]",
+ "properties": {
+ "name": "[variables('webAppName')]",
+ "hostNameSslStates": [
+ {
+ "name": "[concat(parameters('newWebAppName'), '.azurewebsites.net')]",
+ "sslState": "Disabled",
+ "hostType": "Standard"
+ },
+ {
+ "name": "[concat(parameters('newWebAppName'), '.scm.azurewebsites.net')]",
+ "sslState": "Disabled",
+ "hostType": "Repository"
+ }
+ ],
+ "serverFarmId": "[variables('appServicePlanName')]",
+ "reserved": true,
+ "isXenon": false,
+ "hyperV": false,
+ "scmSiteAlsoStopped": false,
+ "clientAffinityEnabled": true,
+ "clientCertEnabled": false,
+ "hostNamesDisabled": false,
+ "containerSize": 0,
+ "dailyMemoryTimeQuota": 0,
+ "httpsOnly": false,
+ "redundancyMode": "None",
+ "siteConfig": {
+ "appSettings": [
+ {
+ "name": "JAVA_OPTS",
+ "value": "-Dserver.port=80"
+ },
+ {
+ "name": "MicrosoftAppId",
+ "value": "[parameters('appId')]"
+ },
+ {
+ "name": "MicrosoftAppPassword",
+ "value": "[parameters('appSecret')]"
+ }
+ ],
+ "cors": {
+ "allowedOrigins": [
+ "https://botservice.hosting.portal.azure.net",
+ "https://hosting.onecloud.azure-test.net/"
+ ]
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Web/sites/config",
+ "apiVersion": "2018-11-01",
+ "name": "[concat(variables('webAppName'), '/web')]",
+ "location": "[variables('resourcesLocation')]",
+ "dependsOn": [
+ "[concat(variables('resourceGroupId'), '/providers/Microsoft.Web/sites/', variables('webAppName'))]"
+ ],
+ "properties": {
+ "numberOfWorkers": 1,
+ "defaultDocuments": [
+ "Default.htm",
+ "Default.html",
+ "Default.asp",
+ "index.htm",
+ "index.html",
+ "iisstart.htm",
+ "default.aspx",
+ "index.php",
+ "hostingstart.html"
+ ],
+ "netFrameworkVersion": "v4.0",
+ "linuxFxVersion": "JAVA|8-jre8",
+ "requestTracingEnabled": false,
+ "remoteDebuggingEnabled": false,
+ "httpLoggingEnabled": false,
+ "logsDirectorySizeLimit": 35,
+ "detailedErrorLoggingEnabled": false,
+ "publishingUsername": "[variables('publishingUsername')]",
+ "scmType": "None",
+ "use32BitWorkerProcess": true,
+ "webSocketsEnabled": false,
+ "alwaysOn": true,
+ "managedPipelineMode": "Integrated",
+ "virtualApplications": [
+ {
+ "virtualPath": "/",
+ "physicalPath": "site\\wwwroot",
+ "preloadEnabled": true
+ }
+ ],
+ "loadBalancing": "LeastRequests",
+ "experiments": {
+ "rampUpRules": []
+ },
+ "autoHealEnabled": false,
+ "localMySqlEnabled": false,
+ "ipSecurityRestrictions": [
+ {
+ "ipAddress": "Any",
+ "action": "Allow",
+ "priority": 1,
+ "name": "Allow all",
+ "description": "Allow all access"
+ }
+ ],
+ "scmIpSecurityRestrictions": [
+ {
+ "ipAddress": "Any",
+ "action": "Allow",
+ "priority": 1,
+ "name": "Allow all",
+ "description": "Allow all access"
+ }
+ ],
+ "scmIpSecurityRestrictionsUseMain": false,
+ "http20Enabled": false,
+ "minTlsVersion": "1.2",
+ "ftpsState": "AllAllowed",
+ "reservedInstanceCount": 0
+ }
+ },
+ {
+ "apiVersion": "2021-03-01",
+ "type": "Microsoft.BotService/botServices",
+ "name": "[parameters('botId')]",
+ "location": "global",
+ "kind": "azurebot",
+ "sku": {
+ "name": "[parameters('botSku')]"
+ },
+ "properties": {
+ "name": "[parameters('botId')]",
+ "displayName": "[parameters('botId')]",
+ "iconUrl": "https://docs.botframework.com/static/devportal/client/images/bot-framework-default.png",
+ "endpoint": "[variables('botEndpoint')]",
+ "msaAppId": "[parameters('appId')]",
+ "luisAppIds": [],
+ "schemaTransformationVersion": "1.3",
+ "isCmekEnabled": false,
+ "isIsolated": false
+ },
+ "dependsOn": [
+ "[concat(variables('resourceGroupId'), '/providers/Microsoft.Web/sites/', variables('webAppName'))]"
+ ]
+ }
+ ],
+ "outputs": {}
+ }
+ }
+ }
+ ]
+}
diff --git a/generators/generators/app/templates/empty/project/deploymentTemplates/template-with-preexisting-rg.json b/generators/generators/app/templates/empty/project/deploymentTemplates/template-with-preexisting-rg.json
new file mode 100644
index 000000000..d6feb0a0f
--- /dev/null
+++ b/generators/generators/app/templates/empty/project/deploymentTemplates/template-with-preexisting-rg.json
@@ -0,0 +1,260 @@
+{
+ "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "appId": {
+ "type": "string",
+ "metadata": {
+ "description": "Active Directory App ID, set as MicrosoftAppId in the Web App's Application Settings."
+ }
+ },
+ "appSecret": {
+ "type": "string",
+ "metadata": {
+ "description": "Active Directory App Password, set as MicrosoftAppPassword in the Web App's Application Settings. Defaults to \"\"."
+ }
+ },
+ "botId": {
+ "type": "string",
+ "metadata": {
+ "description": "The globally unique and immutable bot ID. Also used to configure the displayName of the bot, which is mutable."
+ }
+ },
+ "botSku": {
+ "defaultValue": "S1",
+ "type": "string",
+ "metadata": {
+ "description": "The pricing tier of the Bot Service Registration. Acceptable values are F0 and S1."
+ }
+ },
+ "newAppServicePlanName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The name of the new App Service Plan."
+ }
+ },
+ "newAppServicePlanSku": {
+ "type": "object",
+ "defaultValue": {
+ "name": "P1v2",
+ "tier": "PremiumV2",
+ "size": "P1v2",
+ "family": "Pv2",
+ "capacity": 1
+ },
+ "metadata": {
+ "description": "The SKU of the App Service Plan. Defaults to Standard values."
+ }
+ },
+ "appServicePlanLocation": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The location of the App Service Plan."
+ }
+ },
+ "existingAppServicePlan": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Name of the existing App Service Plan used to create the Web App for the bot."
+ }
+ },
+ "newWebAppName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The globally unique name of the Web App. Defaults to the value passed in for \"botId\"."
+ }
+ }
+ },
+ "variables": {
+ "defaultAppServicePlanName": "[if(empty(parameters('existingAppServicePlan')), 'createNewAppServicePlan', parameters('existingAppServicePlan'))]",
+ "useExistingAppServicePlan": "[not(equals(variables('defaultAppServicePlanName'), 'createNewAppServicePlan'))]",
+ "servicePlanName": "[if(variables('useExistingAppServicePlan'), parameters('existingAppServicePlan'), parameters('newAppServicePlanName'))]",
+ "publishingUsername": "[concat('$', parameters('newWebAppName'))]",
+ "resourcesLocation": "[parameters('appServicePlanLocation')]",
+ "webAppName": "[if(empty(parameters('newWebAppName')), parameters('botId'), parameters('newWebAppName'))]",
+ "siteHost": "[concat(variables('webAppName'), '.azurewebsites.net')]",
+ "botEndpoint": "[concat('https://', variables('siteHost'), '/api/messages')]"
+ },
+ "resources": [
+ {
+ "comments": "Create a new Linux App Service Plan if no existing App Service Plan name was passed in.",
+ "type": "Microsoft.Web/serverfarms",
+ "condition": "[not(variables('useExistingAppServicePlan'))]",
+ "name": "[variables('servicePlanName')]",
+ "apiVersion": "2018-02-01",
+ "location": "[variables('resourcesLocation')]",
+ "sku": "[parameters('newAppServicePlanSku')]",
+ "kind": "linux",
+ "properties": {
+ "perSiteScaling": false,
+ "maximumElasticWorkerCount": 1,
+ "isSpot": false,
+ "reserved": true,
+ "isXenon": false,
+ "hyperV": false,
+ "targetWorkerCount": 0,
+ "targetWorkerSizeId": 0
+ }
+ },
+ {
+ "comments": "Create a Web App using a Linux App Service Plan",
+ "type": "Microsoft.Web/sites",
+ "apiVersion": "2018-11-01",
+ "location": "[variables('resourcesLocation')]",
+ "kind": "app,linux",
+ "dependsOn": [
+ "[resourceId('Microsoft.Web/serverfarms', variables('servicePlanName'))]"
+ ],
+ "name": "[variables('webAppName')]",
+ "properties": {
+ "name": "[variables('webAppName')]",
+ "hostNameSslStates": [
+ {
+ "name": "[concat(parameters('newWebAppName'), '.azurewebsites.net')]",
+ "sslState": "Disabled",
+ "hostType": "Standard"
+ },
+ {
+ "name": "[concat(parameters('newWebAppName'), '.scm.azurewebsites.net')]",
+ "sslState": "Disabled",
+ "hostType": "Repository"
+ }
+ ],
+ "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('servicePlanName'))]",
+ "reserved": true,
+ "isXenon": false,
+ "hyperV": false,
+ "scmSiteAlsoStopped": false,
+ "clientAffinityEnabled": true,
+ "clientCertEnabled": false,
+ "hostNamesDisabled": false,
+ "containerSize": 0,
+ "dailyMemoryTimeQuota": 0,
+ "httpsOnly": false,
+ "redundancyMode": "None",
+ "siteConfig": {
+ "appSettings": [
+ {
+ "name": "JAVA_OPTS",
+ "value": "-Dserver.port=80"
+ },
+ {
+ "name": "MicrosoftAppId",
+ "value": "[parameters('appId')]"
+ },
+ {
+ "name": "MicrosoftAppPassword",
+ "value": "[parameters('appSecret')]"
+ }
+ ],
+ "cors": {
+ "allowedOrigins": [
+ "https://botservice.hosting.portal.azure.net",
+ "https://hosting.onecloud.azure-test.net/"
+ ]
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Web/sites/config",
+ "apiVersion": "2018-11-01",
+ "name": "[concat(variables('webAppName'), '/web')]",
+ "location": "[variables('resourcesLocation')]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Web/sites/', variables('webAppName'))]"
+ ],
+ "properties": {
+ "numberOfWorkers": 1,
+ "defaultDocuments": [
+ "Default.htm",
+ "Default.html",
+ "Default.asp",
+ "index.htm",
+ "index.html",
+ "iisstart.htm",
+ "default.aspx",
+ "index.php",
+ "hostingstart.html"
+ ],
+ "netFrameworkVersion": "v4.0",
+ "linuxFxVersion": "JAVA|8-jre8",
+ "requestTracingEnabled": false,
+ "remoteDebuggingEnabled": false,
+ "httpLoggingEnabled": false,
+ "logsDirectorySizeLimit": 35,
+ "detailedErrorLoggingEnabled": false,
+ "publishingUsername": "[variables('publishingUsername')]",
+ "scmType": "None",
+ "use32BitWorkerProcess": true,
+ "webSocketsEnabled": false,
+ "alwaysOn": true,
+ "managedPipelineMode": "Integrated",
+ "virtualApplications": [
+ {
+ "virtualPath": "/",
+ "physicalPath": "site\\wwwroot",
+ "preloadEnabled": true
+ }
+ ],
+ "loadBalancing": "LeastRequests",
+ "experiments": {
+ "rampUpRules": []
+ },
+ "autoHealEnabled": false,
+ "localMySqlEnabled": false,
+ "ipSecurityRestrictions": [
+ {
+ "ipAddress": "Any",
+ "action": "Allow",
+ "priority": 1,
+ "name": "Allow all",
+ "description": "Allow all access"
+ }
+ ],
+ "scmIpSecurityRestrictions": [
+ {
+ "ipAddress": "Any",
+ "action": "Allow",
+ "priority": 1,
+ "name": "Allow all",
+ "description": "Allow all access"
+ }
+ ],
+ "scmIpSecurityRestrictionsUseMain": false,
+ "http20Enabled": false,
+ "minTlsVersion": "1.2",
+ "ftpsState": "AllAllowed",
+ "reservedInstanceCount": 0
+ }
+ },
+ {
+ "apiVersion": "2021-03-01",
+ "type": "Microsoft.BotService/botServices",
+ "name": "[parameters('botId')]",
+ "location": "global",
+ "kind": "azurebot",
+ "sku": {
+ "name": "[parameters('botSku')]"
+ },
+ "properties": {
+ "name": "[parameters('botId')]",
+ "displayName": "[parameters('botId')]",
+ "iconUrl": "https://docs.botframework.com/static/devportal/client/images/bot-framework-default.png",
+ "endpoint": "[variables('botEndpoint')]",
+ "msaAppId": "[parameters('appId')]",
+ "luisAppIds": [],
+ "schemaTransformationVersion": "1.3",
+ "isCmekEnabled": false,
+ "isIsolated": false
+ },
+ "dependsOn": [
+ "[resourceId('Microsoft.Web/sites/', variables('webAppName'))]"
+ ]
+ }
+ ]
+}
diff --git a/generators/generators/app/templates/empty/project/pom.xml b/generators/generators/app/templates/empty/project/pom.xml
new file mode 100644
index 000000000..2e9fe1986
--- /dev/null
+++ b/generators/generators/app/templates/empty/project/pom.xml
@@ -0,0 +1,259 @@
+
+
+
+ 4.0.0
+
+ <%= packageName %>
+ <%= artifact %>
+ 1.0.0
+ jar
+
+ ${project.groupId}:${project.artifactId}
+ This package contains a Java Bot Echo.
+ http://maven.apache.org
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.4.0
+
+
+
+
+ 1.8
+ 1.8
+ 1.8
+ <%= packageName %>.Application
+ https://botbuilder.myget.org/F/botbuilder-v4-java-daily/maven/
+
+
+
+
+ junit
+ junit
+ 4.13.1
+ test
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ 2.4.0
+ test
+
+
+ org.junit.vintage
+ junit-vintage-engine
+ test
+
+
+
+ org.slf4j
+ slf4j-api
+
+
+ org.apache.logging.log4j
+ log4j-api
+ 2.17.1
+
+
+ org.apache.logging.log4j
+ log4j-core
+ 2.17.1
+
+
+ org.apache.logging.log4j
+ log4j-to-slf4j
+ 2.15.0
+ test
+
+
+
+ com.microsoft.bot
+ bot-integration-spring
+ 4.14.1
+ compile
+
+
+
+
+
+ MyGet
+ ${repo.url}
+
+
+
+
+
+ ossrh
+
+ https://oss.sonatype.org/
+
+
+
+
+
+
+ build
+
+ true
+
+
+
+
+ src/main/resources
+ false
+
+
+
+
+
+ maven-compiler-plugin
+ 3.8.1
+
+ 1.8
+ 1.8
+
+
+
+ maven-war-plugin
+ 3.2.3
+
+ src/main/webapp
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ repackage
+
+
+ <%= packageName %>.Application
+
+
+
+
+
+ com.microsoft.azure
+ azure-webapp-maven-plugin
+ 1.7.0
+
+ V2
+ ${groupname}
+ ${botname}
+
+
+ JAVA_OPTS
+ -Dserver.port=80
+
+
+
+ linux
+ jre8
+ jre8
+
+
+
+
+ ${project.basedir}/target
+
+ *.jar
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-site-plugin
+ 3.7.1
+
+
+ org.apache.maven.plugins
+ maven-project-info-reports-plugin
+ 3.0.0
+
+
+
+
+
+
+
+ publish
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+
+ org.sonatype.plugins
+ nexus-staging-maven-plugin
+ 1.6.8
+ true
+
+ true
+ ossrh
+ https://oss.sonatype.org/
+ true
+
+
+
+
+ org.apache.maven.plugins
+ maven-gpg-plugin
+
+
+ sign-artifacts
+ verify
+
+ sign
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+
+ 8
+ false
+
+
+
+ attach-javadocs
+
+ jar
+
+
+
+
+
+
+
+
+
diff --git a/generators/generators/app/templates/empty/project/src/main/resources/application.properties b/generators/generators/app/templates/empty/project/src/main/resources/application.properties
new file mode 100644
index 000000000..d7d0ee864
--- /dev/null
+++ b/generators/generators/app/templates/empty/project/src/main/resources/application.properties
@@ -0,0 +1,3 @@
+MicrosoftAppId=
+MicrosoftAppPassword=
+server.port=3978
diff --git a/generators/generators/app/templates/empty/project/src/main/resources/log4j2.json b/generators/generators/app/templates/empty/project/src/main/resources/log4j2.json
new file mode 100644
index 000000000..ad838e77f
--- /dev/null
+++ b/generators/generators/app/templates/empty/project/src/main/resources/log4j2.json
@@ -0,0 +1,21 @@
+{
+ "configuration": {
+ "name": "Default",
+ "appenders": {
+ "Console": {
+ "name": "Console-Appender",
+ "target": "SYSTEM_OUT",
+ "PatternLayout": {
+ "pattern":
+ "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"
+ }
+ }
+ },
+ "loggers": {
+ "root": {
+ "level": "debug",
+ "appender-ref": { "ref": "Console-Appender", "level": "debug" }
+ }
+ }
+ }
+}
diff --git a/generators/generators/app/templates/empty/project/src/main/webapp/META-INF/MANIFEST.MF b/generators/generators/app/templates/empty/project/src/main/webapp/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..254272e1c
--- /dev/null
+++ b/generators/generators/app/templates/empty/project/src/main/webapp/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Class-Path:
+
diff --git a/generators/generators/app/templates/empty/project/src/main/webapp/WEB-INF/web.xml b/generators/generators/app/templates/empty/project/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 000000000..383c19004
--- /dev/null
+++ b/generators/generators/app/templates/empty/project/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,12 @@
+
+
+ dispatcher
+
+ org.springframework.web.servlet.DispatcherServlet
+
+
+ contextConfigLocation
+ /WEB-INF/spring/dispatcher-config.xml
+
+ 1
+
\ No newline at end of file
diff --git a/generators/generators/app/templates/empty/project/src/main/webapp/index.html b/generators/generators/app/templates/empty/project/src/main/webapp/index.html
new file mode 100644
index 000000000..1b10a9051
--- /dev/null
+++ b/generators/generators/app/templates/empty/project/src/main/webapp/index.html
@@ -0,0 +1,418 @@
+
+
+
+
+
+
+ <%= botName %>
+
+
+
+
+
+
+
+
+
Your bot is ready!
+
You can test your bot in the Bot Framework Emulator
+ by connecting to http://localhost:3978/api/messages.
+
+
Visit
Azure
+ Bot Service to register your bot and add it to
+ various channels. The bot's endpoint URL typically looks
+ like this:
+
https://your_bots_hostname /api/messages
+
+
+
+
+
+
+
diff --git a/generators/generators/app/templates/empty/src/main/java/Application.java b/generators/generators/app/templates/empty/src/main/java/Application.java
new file mode 100644
index 000000000..44992727f
--- /dev/null
+++ b/generators/generators/app/templates/empty/src/main/java/Application.java
@@ -0,0 +1,65 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package <%= packageName %>;
+
+import com.microsoft.bot.builder.Bot;
+import com.microsoft.bot.integration.AdapterWithErrorHandler;
+import com.microsoft.bot.integration.BotFrameworkHttpAdapter;
+import com.microsoft.bot.integration.Configuration;
+import com.microsoft.bot.integration.spring.BotController;
+import com.microsoft.bot.integration.spring.BotDependencyConfiguration;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Import;
+
+//
+// This is the starting point of the Sprint Boot Bot application.
+//
+@SpringBootApplication
+
+// Use the default BotController to receive incoming Channel messages. A custom
+// controller could be used by eliminating this import and creating a new
+// org.springframework.web.bind.annotation.RestController.
+// The default controller is created by the Spring Boot container using
+// dependency injection. The default route is /api/messages.
+@Import({BotController.class})
+
+/**
+ * This class extends the BotDependencyConfiguration which provides the default
+ * implementations for a Bot application. The Application class should
+ * override methods in order to provide custom implementations.
+ */
+public class Application extends BotDependencyConfiguration {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+ /**
+ * Returns the Bot for this application.
+ *
+ *
+ * The @Component annotation could be used on the Bot class instead of this method
+ * with the @Bean annotation.
+ *
+ *
+ * @return The Bot implementation for this application.
+ */
+ @Bean
+ public Bot getBot() {
+ return new EmptyBot();
+ }
+
+ /**
+ * Returns a custom Adapter that provides error handling.
+ *
+ * @param configuration The Configuration object to use.
+ * @return An error handling BotFrameworkHttpAdapter.
+ */
+ @Override
+ public BotFrameworkHttpAdapter getBotFrameworkHttpAdaptor(Configuration configuration) {
+ return new AdapterWithErrorHandler(configuration);
+ }
+}
diff --git a/generators/generators/app/templates/empty/src/main/java/EmptyBot.java b/generators/generators/app/templates/empty/src/main/java/EmptyBot.java
new file mode 100644
index 000000000..3f8d6208d
--- /dev/null
+++ b/generators/generators/app/templates/empty/src/main/java/EmptyBot.java
@@ -0,0 +1,39 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package <%= packageName %>;
+
+import com.codepoetics.protonpack.collectors.CompletableFutures;
+import com.microsoft.bot.builder.ActivityHandler;
+import com.microsoft.bot.builder.MessageFactory;
+import com.microsoft.bot.builder.TurnContext;
+import com.microsoft.bot.schema.ChannelAccount;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * This class implements the functionality of the Bot.
+ *
+ *
+ * This is where application specific logic for interacting with the users would be added. For this
+ * sample, the {@link #onMessageActivity(TurnContext)} echos the text back to the user. The {@link
+ * #onMembersAdded(List, TurnContext)} will send a greeting to new conversation participants.
+ *
+ */
+public class EmptyBot extends ActivityHandler {
+
+ @Override
+ protected CompletableFuture onMembersAdded(
+ List membersAdded,
+ TurnContext turnContext
+ ) {
+ return membersAdded.stream()
+ .filter(
+ member -> !StringUtils
+ .equals(member.getId(), turnContext.getActivity().getRecipient().getId())
+ ).map(channel -> turnContext.sendActivity(MessageFactory.text("Hello world!")))
+ .collect(CompletableFutures.toFutureList()).thenApply(resourceResponses -> null);
+ }
+}
diff --git a/generators/generators/app/templates/empty/src/test/java/ApplicationTests.java b/generators/generators/app/templates/empty/src/test/java/ApplicationTests.java
new file mode 100644
index 000000000..37084390c
--- /dev/null
+++ b/generators/generators/app/templates/empty/src/test/java/ApplicationTests.java
@@ -0,0 +1,19 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package <%= packageName %>;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class ApplicationTests {
+
+ @Test
+ public void contextLoads() {
+ }
+
+}
diff --git a/generators/package-lock.json b/generators/package-lock.json
new file mode 100644
index 000000000..1ac056e7d
--- /dev/null
+++ b/generators/package-lock.json
@@ -0,0 +1,1927 @@
+{
+ "name": "generator-botbuilder-java",
+ "version": "4.14.0",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "generator-botbuilder-java",
+ "version": "4.14.0",
+ "license": "SEE LICENSE IN LICENSE.md",
+ "dependencies": {
+ "chalk": "~4.0.0",
+ "lodash": "~4.17.15",
+ "mkdirp": "^1.0.4",
+ "yeoman-generator": "^5.7.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
+ "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
+ "dependencies": {
+ "@babel/highlight": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.19.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
+ "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
+ "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.18.6",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "node_modules/@babel/highlight/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@octokit/auth-token": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz",
+ "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==",
+ "dependencies": {
+ "@octokit/types": "^6.0.3"
+ }
+ },
+ "node_modules/@octokit/core": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz",
+ "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==",
+ "dependencies": {
+ "@octokit/auth-token": "^2.4.4",
+ "@octokit/graphql": "^4.5.8",
+ "@octokit/request": "^5.6.3",
+ "@octokit/request-error": "^2.0.5",
+ "@octokit/types": "^6.0.3",
+ "before-after-hook": "^2.2.0",
+ "universal-user-agent": "^6.0.0"
+ }
+ },
+ "node_modules/@octokit/endpoint": {
+ "version": "6.0.12",
+ "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz",
+ "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==",
+ "dependencies": {
+ "@octokit/types": "^6.0.3",
+ "is-plain-object": "^5.0.0",
+ "universal-user-agent": "^6.0.0"
+ }
+ },
+ "node_modules/@octokit/graphql": {
+ "version": "4.8.0",
+ "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz",
+ "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==",
+ "dependencies": {
+ "@octokit/request": "^5.6.0",
+ "@octokit/types": "^6.0.3",
+ "universal-user-agent": "^6.0.0"
+ }
+ },
+ "node_modules/@octokit/openapi-types": {
+ "version": "12.11.0",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz",
+ "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ=="
+ },
+ "node_modules/@octokit/plugin-paginate-rest": {
+ "version": "2.21.3",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz",
+ "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==",
+ "dependencies": {
+ "@octokit/types": "^6.40.0"
+ },
+ "peerDependencies": {
+ "@octokit/core": ">=2"
+ }
+ },
+ "node_modules/@octokit/plugin-request-log": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz",
+ "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==",
+ "peerDependencies": {
+ "@octokit/core": ">=3"
+ }
+ },
+ "node_modules/@octokit/plugin-rest-endpoint-methods": {
+ "version": "5.16.2",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz",
+ "integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==",
+ "dependencies": {
+ "@octokit/types": "^6.39.0",
+ "deprecation": "^2.3.1"
+ },
+ "peerDependencies": {
+ "@octokit/core": ">=3"
+ }
+ },
+ "node_modules/@octokit/request": {
+ "version": "5.6.3",
+ "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz",
+ "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==",
+ "dependencies": {
+ "@octokit/endpoint": "^6.0.1",
+ "@octokit/request-error": "^2.1.0",
+ "@octokit/types": "^6.16.1",
+ "is-plain-object": "^5.0.0",
+ "node-fetch": "^2.6.7",
+ "universal-user-agent": "^6.0.0"
+ }
+ },
+ "node_modules/@octokit/request-error": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz",
+ "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==",
+ "dependencies": {
+ "@octokit/types": "^6.0.3",
+ "deprecation": "^2.0.0",
+ "once": "^1.4.0"
+ }
+ },
+ "node_modules/@octokit/rest": {
+ "version": "18.12.0",
+ "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz",
+ "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==",
+ "dependencies": {
+ "@octokit/core": "^3.5.1",
+ "@octokit/plugin-paginate-rest": "^2.16.8",
+ "@octokit/plugin-request-log": "^1.0.4",
+ "@octokit/plugin-rest-endpoint-methods": "^5.12.0"
+ }
+ },
+ "node_modules/@octokit/types": {
+ "version": "6.41.0",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz",
+ "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==",
+ "dependencies": {
+ "@octokit/openapi-types": "^12.11.0"
+ }
+ },
+ "node_modules/@types/normalize-package-data": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
+ "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw=="
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "node_modules/before-after-hook": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz",
+ "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ=="
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz",
+ "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/dargs": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz",
+ "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deprecation": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz",
+ "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ=="
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/github-username": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/github-username/-/github-username-6.0.0.tgz",
+ "integrity": "sha512-7TTrRjxblSI5l6adk9zd+cV5d6i1OrJSo3Vr9xdGqFLBQo0mz5P9eIfKCDJ7eekVGGFLbce0qbPSnktXV2BjDQ==",
+ "dependencies": {
+ "@octokit/rest": "^18.0.6"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/hosted-git-info": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw=="
+ },
+ "node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "node_modules/interpret": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
+ "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
+ },
+ "node_modules/is-core-module": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
+ "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
+ "dependencies": {
+ "has": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
+ },
+ "node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
+ "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "node_modules/node-fetch": {
+ "version": "2.6.7",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
+ "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dependencies": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "node_modules/normalize-package-data/node_modules/semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+ },
+ "node_modules/read-pkg": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+ "dependencies": {
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^2.5.0",
+ "parse-json": "^5.0.0",
+ "type-fest": "^0.6.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/read-pkg-up": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+ "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+ "dependencies": {
+ "find-up": "^4.1.0",
+ "read-pkg": "^5.2.0",
+ "type-fest": "^0.8.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/read-pkg/node_modules/type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/rechoir": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+ "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==",
+ "dependencies": {
+ "resolve": "^1.1.6"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+ "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+ "dependencies": {
+ "is-core-module": "^2.9.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/run-async": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
+ "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.3.8",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shelljs": {
+ "version": "0.8.5",
+ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz",
+ "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==",
+ "dependencies": {
+ "glob": "^7.0.0",
+ "interpret": "^1.0.0",
+ "rechoir": "^0.6.2"
+ },
+ "bin": {
+ "shjs": "bin/shjs"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
+ },
+ "node_modules/sort-keys": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-4.2.0.tgz",
+ "integrity": "sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==",
+ "dependencies": {
+ "is-plain-obj": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/spdx-correct": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+ "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
+ "dependencies": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-exceptions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+ "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A=="
+ },
+ "node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-license-ids": {
+ "version": "3.0.12",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz",
+ "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA=="
+ },
+ "node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="
+ },
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+ },
+ "node_modules/type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/universal-user-agent": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz",
+ "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w=="
+ },
+ "node_modules/validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "dependencies": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ },
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ },
+ "node_modules/yeoman-generator": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/yeoman-generator/-/yeoman-generator-5.7.0.tgz",
+ "integrity": "sha512-z9ZwgKoDOd+llPDCwn8Ax2l4In5FMhlslxdeByW4AMxhT+HbTExXKEAahsClHSbwZz1i5OzRwLwRIUdOJBr5Bw==",
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "dargs": "^7.0.0",
+ "debug": "^4.1.1",
+ "execa": "^5.1.1",
+ "github-username": "^6.0.0",
+ "lodash": "^4.17.11",
+ "minimist": "^1.2.5",
+ "read-pkg-up": "^7.0.1",
+ "run-async": "^2.0.0",
+ "semver": "^7.2.1",
+ "shelljs": "^0.8.5",
+ "sort-keys": "^4.2.0",
+ "text-table": "^0.2.0"
+ },
+ "engines": {
+ "node": ">=12.10.0"
+ },
+ "peerDependencies": {
+ "yeoman-environment": "^3.2.0"
+ },
+ "peerDependenciesMeta": {
+ "yeoman-environment": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/yeoman-generator/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ }
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
+ "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
+ "requires": {
+ "@babel/highlight": "^7.18.6"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.19.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
+ "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w=="
+ },
+ "@babel/highlight": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
+ "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.18.6",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "@octokit/auth-token": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz",
+ "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==",
+ "requires": {
+ "@octokit/types": "^6.0.3"
+ }
+ },
+ "@octokit/core": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz",
+ "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==",
+ "requires": {
+ "@octokit/auth-token": "^2.4.4",
+ "@octokit/graphql": "^4.5.8",
+ "@octokit/request": "^5.6.3",
+ "@octokit/request-error": "^2.0.5",
+ "@octokit/types": "^6.0.3",
+ "before-after-hook": "^2.2.0",
+ "universal-user-agent": "^6.0.0"
+ }
+ },
+ "@octokit/endpoint": {
+ "version": "6.0.12",
+ "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz",
+ "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==",
+ "requires": {
+ "@octokit/types": "^6.0.3",
+ "is-plain-object": "^5.0.0",
+ "universal-user-agent": "^6.0.0"
+ }
+ },
+ "@octokit/graphql": {
+ "version": "4.8.0",
+ "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz",
+ "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==",
+ "requires": {
+ "@octokit/request": "^5.6.0",
+ "@octokit/types": "^6.0.3",
+ "universal-user-agent": "^6.0.0"
+ }
+ },
+ "@octokit/openapi-types": {
+ "version": "12.11.0",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz",
+ "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ=="
+ },
+ "@octokit/plugin-paginate-rest": {
+ "version": "2.21.3",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz",
+ "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==",
+ "requires": {
+ "@octokit/types": "^6.40.0"
+ }
+ },
+ "@octokit/plugin-request-log": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz",
+ "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==",
+ "requires": {}
+ },
+ "@octokit/plugin-rest-endpoint-methods": {
+ "version": "5.16.2",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz",
+ "integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==",
+ "requires": {
+ "@octokit/types": "^6.39.0",
+ "deprecation": "^2.3.1"
+ }
+ },
+ "@octokit/request": {
+ "version": "5.6.3",
+ "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz",
+ "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==",
+ "requires": {
+ "@octokit/endpoint": "^6.0.1",
+ "@octokit/request-error": "^2.1.0",
+ "@octokit/types": "^6.16.1",
+ "is-plain-object": "^5.0.0",
+ "node-fetch": "^2.6.7",
+ "universal-user-agent": "^6.0.0"
+ }
+ },
+ "@octokit/request-error": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz",
+ "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==",
+ "requires": {
+ "@octokit/types": "^6.0.3",
+ "deprecation": "^2.0.0",
+ "once": "^1.4.0"
+ }
+ },
+ "@octokit/rest": {
+ "version": "18.12.0",
+ "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz",
+ "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==",
+ "requires": {
+ "@octokit/core": "^3.5.1",
+ "@octokit/plugin-paginate-rest": "^2.16.8",
+ "@octokit/plugin-request-log": "^1.0.4",
+ "@octokit/plugin-rest-endpoint-methods": "^5.12.0"
+ }
+ },
+ "@octokit/types": {
+ "version": "6.41.0",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz",
+ "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==",
+ "requires": {
+ "@octokit/openapi-types": "^12.11.0"
+ }
+ },
+ "@types/normalize-package-data": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
+ "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw=="
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "before-after-hook": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz",
+ "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ=="
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz",
+ "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "dargs": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz",
+ "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg=="
+ },
+ "debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "deprecation": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz",
+ "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ=="
+ },
+ "error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "requires": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
+ },
+ "execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "requires": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ }
+ },
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="
+ },
+ "github-username": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/github-username/-/github-username-6.0.0.tgz",
+ "integrity": "sha512-7TTrRjxblSI5l6adk9zd+cV5d6i1OrJSo3Vr9xdGqFLBQo0mz5P9eIfKCDJ7eekVGGFLbce0qbPSnktXV2BjDQ==",
+ "requires": {
+ "@octokit/rest": "^18.0.6"
+ }
+ },
+ "glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "hosted-git-info": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw=="
+ },
+ "human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "interpret": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
+ "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA=="
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
+ },
+ "is-core-module": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
+ "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA=="
+ },
+ "is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
+ },
+ "is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ },
+ "json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
+ },
+ "lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
+ },
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
+ },
+ "mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
+ },
+ "minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
+ "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g=="
+ },
+ "mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "node-fetch": {
+ "version": "2.6.7",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
+ "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
+ "requires": {
+ "whatwg-url": "^5.0.0"
+ }
+ },
+ "normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "requires": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+ }
+ }
+ },
+ "npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "requires": {
+ "path-key": "^3.0.0"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "requires": {
+ "mimic-fn": "^2.1.0"
+ }
+ },
+ "p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "requires": {
+ "p-limit": "^2.2.0"
+ }
+ },
+ "p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
+ },
+ "parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ }
+ },
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
+ },
+ "path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+ },
+ "read-pkg": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+ "requires": {
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^2.5.0",
+ "parse-json": "^5.0.0",
+ "type-fest": "^0.6.0"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg=="
+ }
+ }
+ },
+ "read-pkg-up": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+ "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+ "requires": {
+ "find-up": "^4.1.0",
+ "read-pkg": "^5.2.0",
+ "type-fest": "^0.8.1"
+ }
+ },
+ "rechoir": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+ "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==",
+ "requires": {
+ "resolve": "^1.1.6"
+ }
+ },
+ "resolve": {
+ "version": "1.22.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+ "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+ "requires": {
+ "is-core-module": "^2.9.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ }
+ },
+ "run-async": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
+ "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ=="
+ },
+ "semver": {
+ "version": "7.3.8",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
+ },
+ "shelljs": {
+ "version": "0.8.5",
+ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz",
+ "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==",
+ "requires": {
+ "glob": "^7.0.0",
+ "interpret": "^1.0.0",
+ "rechoir": "^0.6.2"
+ }
+ },
+ "signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
+ },
+ "sort-keys": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-4.2.0.tgz",
+ "integrity": "sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==",
+ "requires": {
+ "is-plain-obj": "^2.0.0"
+ }
+ },
+ "spdx-correct": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+ "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
+ "requires": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-exceptions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+ "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A=="
+ },
+ "spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "requires": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-license-ids": {
+ "version": "3.0.12",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz",
+ "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA=="
+ },
+ "strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="
+ },
+ "tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+ },
+ "type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="
+ },
+ "universal-user-agent": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz",
+ "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w=="
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "requires": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
+ },
+ "whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "requires": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ },
+ "yeoman-generator": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/yeoman-generator/-/yeoman-generator-5.7.0.tgz",
+ "integrity": "sha512-z9ZwgKoDOd+llPDCwn8Ax2l4In5FMhlslxdeByW4AMxhT+HbTExXKEAahsClHSbwZz1i5OzRwLwRIUdOJBr5Bw==",
+ "requires": {
+ "chalk": "^4.1.0",
+ "dargs": "^7.0.0",
+ "debug": "^4.1.1",
+ "execa": "^5.1.1",
+ "github-username": "^6.0.0",
+ "lodash": "^4.17.11",
+ "minimist": "^1.2.5",
+ "read-pkg-up": "^7.0.1",
+ "run-async": "^2.0.0",
+ "semver": "^7.2.1",
+ "shelljs": "^0.8.5",
+ "sort-keys": "^4.2.0",
+ "text-table": "^0.2.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/generators/package.json b/generators/package.json
new file mode 100644
index 000000000..6c582eac3
--- /dev/null
+++ b/generators/package.json
@@ -0,0 +1,32 @@
+{
+ "name": "generator-botbuilder-java",
+ "version": "4.14.0",
+ "description": "A yeoman generator for creating Java bots built with Bot Framework v4",
+ "homepage": "https://github.com/Microsoft/BotBuilder-Java/tree/main/generators",
+ "author": {
+ "name": "Microsoft",
+ "email": "botframework@microsoft.com",
+ "url": "http://dev.botframework.com"
+ },
+ "license": "SEE LICENSE IN LICENSE.md",
+ "repository": "https://github.com/Microsoft/BotBuilder-Java.git",
+ "files": [
+ "components",
+ "generators"
+ ],
+ "keywords": [
+ "botbuilder",
+ "bots",
+ "bot framework",
+ "yeoman-generator",
+ "Microsoft AI",
+ "Microsoft Teams",
+ "Conversational AI"
+ ],
+ "dependencies": {
+ "chalk": "~4.0.0",
+ "lodash": "~4.17.15",
+ "mkdirp": "^1.0.4",
+ "yeoman-generator": "^5.7.0"
+ }
+}
diff --git a/generators/target/npmlist.json b/generators/target/npmlist.json
new file mode 100644
index 000000000..433027994
--- /dev/null
+++ b/generators/target/npmlist.json
@@ -0,0 +1 @@
+{"name":"generator-java","version":"4.9.1","dependencies":{"camelcase":{"version":"6.0.0"},"chalk":{"version":"4.0.0","dependencies":{"ansi-styles":{"version":"4.3.0","dependencies":{"color-convert":{"version":"2.0.1","dependencies":{"color-name":{"version":"1.1.4"}}}}},"supports-color":{"version":"7.2.0","dependencies":{"has-flag":{"version":"4.0.0"}}}}},"lodash":{"version":"4.17.20"},"mkdirp":{"version":"1.0.4"},"yeoman-generator":{"version":"4.10.1","dependencies":{"async":{"version":"2.6.3","dependencies":{"lodash":{"version":"4.17.20"}}},"cli-table":{"version":"0.3.4","dependencies":{"chalk":{"version":"2.4.2","dependencies":{"ansi-styles":{"version":"3.2.1","dependencies":{"color-convert":{"version":"1.9.3","dependencies":{"color-name":{"version":"1.1.3"}}}}},"supports-color":{"version":"5.5.0","dependencies":{"has-flag":{"version":"3.0.0"}}},"escape-string-regexp":{"version":"1.0.5"}}},"string-width":{"version":"4.2.0","dependencies":{"emoji-regex":{"version":"8.0.0"},"is-fullwidth-code-point":{"version":"3.0.0"},"strip-ansi":{"version":"6.0.0","dependencies":{"ansi-regex":{"version":"5.0.0"}}}}}}},"cross-spawn":{"version":"6.0.5","dependencies":{"semver":{"version":"5.7.1"},"nice-try":{"version":"1.0.5"},"path-key":{"version":"2.0.1"},"shebang-command":{"version":"1.2.0","dependencies":{"shebang-regex":{"version":"1.0.0"}}},"which":{"version":"1.3.1","dependencies":{"isexe":{"version":"2.0.0"}}}}},"dargs":{"version":"6.1.0"},"dateformat":{"version":"3.0.3"},"debug":{"version":"4.3.1","dependencies":{"ms":{"version":"2.1.2"}}},"diff":{"version":"4.0.2"},"error":{"version":"7.2.1","dependencies":{"string-template":{"version":"0.2.1"}}},"find-up":{"version":"3.0.0","dependencies":{"locate-path":{"version":"3.0.0","dependencies":{"p-locate":{"version":"3.0.0","dependencies":{"p-limit":{"version":"2.3.0","dependencies":{"p-try":{"version":"2.2.0"}}}}},"path-exists":{"version":"3.0.0"}}}}},"github-username":{"version":"3.0.0","dependencies":{"gh-got":{"version":"5.0.0","dependencies":{"got":{"version":"6.7.1","dependencies":{"create-error-class":{"version":"3.0.2","dependencies":{"capture-stack-trace":{"version":"1.0.1"}}},"duplexer3":{"version":"0.1.4"},"get-stream":{"version":"3.0.0"},"is-redirect":{"version":"1.0.0"},"is-retry-allowed":{"version":"1.2.0"},"is-stream":{"version":"1.1.0"},"lowercase-keys":{"version":"1.0.1"},"safe-buffer":{"version":"5.2.1"},"timed-out":{"version":"4.0.1"},"unzip-response":{"version":"2.0.1"},"url-parse-lax":{"version":"1.0.0","dependencies":{"prepend-http":{"version":"1.0.4"}}}}},"is-plain-obj":{"version":"1.1.0"}}}}},"grouped-queue":{"version":"1.1.0","dependencies":{"lodash":{"version":"4.17.20"}}},"istextorbinary":{"version":"2.6.0","dependencies":{"binaryextensions":{"version":"2.3.0"},"editions":{"version":"2.3.1","dependencies":{"semver":{"version":"6.3.0"},"errlop":{"version":"2.2.0"}}},"textextensions":{"version":"2.6.0"}}},"lodash":{"version":"4.17.20"},"make-dir":{"version":"3.1.0","dependencies":{"semver":{"version":"6.3.0"}}},"mem-fs-editor":{"version":"6.0.0","dependencies":{"commondir":{"version":"1.0.1"},"deep-extend":{"version":"0.6.0"},"ejs":{"version":"2.7.4"},"glob":{"version":"7.1.6","dependencies":{"fs.realpath":{"version":"1.0.0"},"inflight":{"version":"1.0.6","dependencies":{"once":{"version":"1.4.0"},"wrappy":{"version":"1.0.2"}}},"inherits":{"version":"2.0.4"},"minimatch":{"version":"3.0.4","dependencies":{"brace-expansion":{"version":"1.1.11","dependencies":{"balanced-match":{"version":"1.0.0"},"concat-map":{"version":"0.0.1"}}}}},"once":{"version":"1.4.0","dependencies":{"wrappy":{"version":"1.0.2"}}},"path-is-absolute":{"version":"1.0.1"}}},"globby":{"version":"9.2.0","dependencies":{"@types/glob":{"version":"7.1.3","dependencies":{"@types/minimatch":{"version":"3.0.3"},"@types/node":{"version":"14.14.11"}}},"array-union":{"version":"1.0.2","dependencies":{"array-uniq":{"version":"1.0.3"}}},"dir-glob":{"version":"2.2.2","dependencies":{"path-type":{"version":"3.0.0","dependencies":{"pify":{"version":"3.0.0"}}}}},"fast-glob":{"version":"2.2.7","dependencies":{"@mrmlnc/readdir-enhanced":{"version":"2.2.1","dependencies":{"call-me-maybe":{"version":"1.0.1"},"glob-to-regexp":{"version":"0.3.0"}}},"@nodelib/fs.stat":{"version":"1.1.3"},"glob-parent":{"version":"3.1.0","dependencies":{"is-glob":{"version":"3.1.0","dependencies":{"is-extglob":{"version":"2.1.1"}}},"path-dirname":{"version":"1.0.2"}}},"is-glob":{"version":"4.0.1","dependencies":{"is-extglob":{"version":"2.1.1"}}},"merge2":{"version":"1.4.1"},"micromatch":{"version":"3.1.10","dependencies":{"arr-diff":{"version":"4.0.0"},"array-unique":{"version":"0.3.2"},"braces":{"version":"2.3.2","dependencies":{"arr-flatten":{"version":"1.1.0"},"array-unique":{"version":"0.3.2"},"extend-shallow":{"version":"2.0.1","dependencies":{"is-extendable":{"version":"0.1.1"}}},"fill-range":{"version":"4.0.0","dependencies":{"extend-shallow":{"version":"2.0.1","dependencies":{"is-extendable":{"version":"0.1.1"}}},"is-number":{"version":"3.0.0","dependencies":{"kind-of":{"version":"3.2.2","dependencies":{"is-buffer":{"version":"1.1.6"}}}}},"repeat-string":{"version":"1.6.1"},"to-regex-range":{"version":"2.1.1","dependencies":{"is-number":{"version":"3.0.0"},"repeat-string":{"version":"1.6.1"}}}}},"isobject":{"version":"3.0.1"},"repeat-element":{"version":"1.1.3"},"snapdragon":{"version":"0.8.2"},"snapdragon-node":{"version":"2.1.1","dependencies":{"isobject":{"version":"3.0.1"},"define-property":{"version":"1.0.0","dependencies":{"is-descriptor":{"version":"1.0.2","dependencies":{"kind-of":{"version":"6.0.3"},"is-accessor-descriptor":{"version":"1.0.0","dependencies":{"kind-of":{"version":"6.0.3"}}},"is-data-descriptor":{"version":"1.0.0","dependencies":{"kind-of":{"version":"6.0.3"}}}}}}},"snapdragon-util":{"version":"3.0.1","dependencies":{"kind-of":{"version":"3.2.2","dependencies":{"is-buffer":{"version":"1.1.6"}}}}}}},"split-string":{"version":"3.1.0","dependencies":{"extend-shallow":{"version":"3.0.2"}}},"to-regex":{"version":"3.0.2"}}},"define-property":{"version":"2.0.2","dependencies":{"is-descriptor":{"version":"1.0.2","dependencies":{"is-accessor-descriptor":{"version":"1.0.0","dependencies":{"kind-of":{"version":"6.0.3"}}},"is-data-descriptor":{"version":"1.0.0","dependencies":{"kind-of":{"version":"6.0.3"}}},"kind-of":{"version":"6.0.3"}}},"isobject":{"version":"3.0.1"}}},"extend-shallow":{"version":"3.0.2","dependencies":{"assign-symbols":{"version":"1.0.0"},"is-extendable":{"version":"1.0.1","dependencies":{"is-plain-object":{"version":"2.0.4"}}}}},"extglob":{"version":"2.0.4","dependencies":{"array-unique":{"version":"0.3.2"},"expand-brackets":{"version":"2.1.4","dependencies":{"debug":{"version":"2.6.9","dependencies":{"ms":{"version":"2.0.0"}}},"define-property":{"version":"0.2.5","dependencies":{"is-descriptor":{"version":"0.1.6"}}},"extend-shallow":{"version":"2.0.1","dependencies":{"is-extendable":{"version":"0.1.1"}}},"posix-character-classes":{"version":"0.1.1"},"regex-not":{"version":"1.0.2"},"snapdragon":{"version":"0.8.2"},"to-regex":{"version":"3.0.2"}}},"define-property":{"version":"1.0.0","dependencies":{"is-descriptor":{"version":"1.0.2","dependencies":{"is-accessor-descriptor":{"version":"1.0.0","dependencies":{"kind-of":{"version":"6.0.3"}}},"is-data-descriptor":{"version":"1.0.0","dependencies":{"kind-of":{"version":"6.0.3"}}},"kind-of":{"version":"6.0.3"}}}}},"extend-shallow":{"version":"2.0.1","dependencies":{"is-extendable":{"version":"0.1.1"}}},"fragment-cache":{"version":"0.2.1"},"regex-not":{"version":"1.0.2"},"snapdragon":{"version":"0.8.2"},"to-regex":{"version":"3.0.2"}}},"fragment-cache":{"version":"0.2.1","dependencies":{"map-cache":{"version":"0.2.2"}}},"kind-of":{"version":"6.0.3"},"nanomatch":{"version":"1.2.13","dependencies":{"arr-diff":{"version":"4.0.0"},"array-unique":{"version":"0.3.2"},"define-property":{"version":"2.0.2"},"extend-shallow":{"version":"3.0.2"},"fragment-cache":{"version":"0.2.1"},"is-windows":{"version":"1.0.2"},"kind-of":{"version":"6.0.3"},"object.pick":{"version":"1.3.0"},"regex-not":{"version":"1.0.2"},"snapdragon":{"version":"0.8.2"},"to-regex":{"version":"3.0.2"}}},"object.pick":{"version":"1.3.0","dependencies":{"isobject":{"version":"3.0.1"}}},"regex-not":{"version":"1.0.2","dependencies":{"extend-shallow":{"version":"3.0.2"},"safe-regex":{"version":"1.1.0","dependencies":{"ret":{"version":"0.1.15"}}}}},"snapdragon":{"version":"0.8.2","dependencies":{"base":{"version":"0.11.2","dependencies":{"define-property":{"version":"1.0.0","dependencies":{"is-descriptor":{"version":"1.0.2","dependencies":{"is-accessor-descriptor":{"version":"1.0.0","dependencies":{"kind-of":{"version":"6.0.3"}}},"is-data-descriptor":{"version":"1.0.0","dependencies":{"kind-of":{"version":"6.0.3"}}},"kind-of":{"version":"6.0.3"}}}}},"cache-base":{"version":"1.0.1","dependencies":{"collection-visit":{"version":"1.0.0","dependencies":{"map-visit":{"version":"1.0.0","dependencies":{"object-visit":{"version":"1.0.1"}}},"object-visit":{"version":"1.0.1","dependencies":{"isobject":{"version":"3.0.1"}}}}},"component-emitter":{"version":"1.3.0"},"get-value":{"version":"2.0.6"},"has-value":{"version":"1.0.0","dependencies":{"get-value":{"version":"2.0.6"},"has-values":{"version":"1.0.0","dependencies":{"kind-of":{"version":"4.0.0","dependencies":{"is-buffer":{"version":"1.1.6"}}},"is-number":{"version":"3.0.0"}}},"isobject":{"version":"3.0.1"}}},"isobject":{"version":"3.0.1"},"set-value":{"version":"2.0.1","dependencies":{"is-extendable":{"version":"0.1.1"},"is-plain-object":{"version":"2.0.4"},"extend-shallow":{"version":"2.0.1","dependencies":{"is-extendable":{"version":"0.1.1"}}},"split-string":{"version":"3.1.0"}}},"to-object-path":{"version":"0.3.0"},"union-value":{"version":"1.0.1","dependencies":{"arr-union":{"version":"3.1.0"},"get-value":{"version":"2.0.6"},"is-extendable":{"version":"0.1.1"},"set-value":{"version":"2.0.1"}}},"unset-value":{"version":"1.0.0","dependencies":{"isobject":{"version":"3.0.1"},"has-value":{"version":"0.3.1","dependencies":{"get-value":{"version":"2.0.6"},"isobject":{"version":"2.1.0","dependencies":{"isarray":{"version":"1.0.0"}}},"has-values":{"version":"0.1.4"}}}}}}},"class-utils":{"version":"0.3.6","dependencies":{"arr-union":{"version":"3.1.0"},"define-property":{"version":"0.2.5","dependencies":{"is-descriptor":{"version":"0.1.6"}}},"isobject":{"version":"3.0.1"},"static-extend":{"version":"0.1.2","dependencies":{"object-copy":{"version":"0.1.0","dependencies":{"copy-descriptor":{"version":"0.1.1"},"define-property":{"version":"0.2.5","dependencies":{"is-descriptor":{"version":"0.1.6"}}},"kind-of":{"version":"3.2.2","dependencies":{"is-buffer":{"version":"1.1.6"}}}}},"define-property":{"version":"0.2.5","dependencies":{"is-descriptor":{"version":"0.1.6"}}}}}}},"component-emitter":{"version":"1.3.0"},"isobject":{"version":"3.0.1"},"mixin-deep":{"version":"1.3.2","dependencies":{"for-in":{"version":"1.0.2"},"is-extendable":{"version":"1.0.1","dependencies":{"is-plain-object":{"version":"2.0.4"}}}}},"pascalcase":{"version":"0.1.1"}}},"map-cache":{"version":"0.2.2"},"debug":{"version":"2.6.9","dependencies":{"ms":{"version":"2.0.0"}}},"define-property":{"version":"0.2.5","dependencies":{"is-descriptor":{"version":"0.1.6","dependencies":{"is-accessor-descriptor":{"version":"0.1.6","dependencies":{"kind-of":{"version":"3.2.2","dependencies":{"is-buffer":{"version":"1.1.6"}}}}},"is-data-descriptor":{"version":"0.1.4","dependencies":{"kind-of":{"version":"3.2.2","dependencies":{"is-buffer":{"version":"1.1.6"}}}}},"kind-of":{"version":"5.1.0"}}}}},"extend-shallow":{"version":"2.0.1","dependencies":{"is-extendable":{"version":"0.1.1"}}},"source-map":{"version":"0.5.7"},"source-map-resolve":{"version":"0.5.3","dependencies":{"atob":{"version":"2.1.2"},"decode-uri-component":{"version":"0.2.0"},"resolve-url":{"version":"0.2.1"},"source-map-url":{"version":"0.4.0"},"urix":{"version":"0.1.0"}}},"use":{"version":"3.1.1"}}},"to-regex":{"version":"3.0.2","dependencies":{"define-property":{"version":"2.0.2"},"extend-shallow":{"version":"3.0.2"},"regex-not":{"version":"1.0.2"},"safe-regex":{"version":"1.1.0"}}}}}}},"glob":{"version":"7.1.6"},"ignore":{"version":"4.0.6"},"pify":{"version":"4.0.1"},"slash":{"version":"2.0.0"}}},"isbinaryfile":{"version":"4.0.6"},"mkdirp":{"version":"0.5.5","dependencies":{"minimist":{"version":"1.2.5"}}},"multimatch":{"version":"4.0.0","dependencies":{"@types/minimatch":{"version":"3.0.3"},"array-differ":{"version":"3.0.0"},"arrify":{"version":"2.0.1"},"minimatch":{"version":"3.0.4"},"array-union":{"version":"2.1.0"}}},"rimraf":{"version":"2.7.1"},"through2":{"version":"3.0.2"},"vinyl":{"version":"2.2.1","dependencies":{"clone":{"version":"2.1.2"},"clone-buffer":{"version":"1.0.0"},"clone-stats":{"version":"1.0.0"},"cloneable-readable":{"version":"1.1.3","dependencies":{"readable-stream":{"version":"2.3.7","dependencies":{"safe-buffer":{"version":"5.1.2"},"string_decoder":{"version":"1.1.1","dependencies":{"safe-buffer":{"version":"5.1.2"}}},"core-util-is":{"version":"1.0.2"},"inherits":{"version":"2.0.4"},"isarray":{"version":"1.0.0"},"process-nextick-args":{"version":"2.0.1"},"util-deprecate":{"version":"1.0.2"}}},"inherits":{"version":"2.0.4"},"process-nextick-args":{"version":"2.0.1"}}},"remove-trailing-separator":{"version":"1.1.0"},"replace-ext":{"version":"1.0.1"}}}}},"minimist":{"version":"1.2.5"},"pretty-bytes":{"version":"5.4.1"},"read-chunk":{"version":"3.2.0","dependencies":{"pify":{"version":"4.0.1"},"with-open-file":{"version":"0.1.7","dependencies":{"p-finally":{"version":"1.0.0"},"p-try":{"version":"2.2.0"},"pify":{"version":"4.0.1"}}}}},"read-pkg-up":{"version":"5.0.0","dependencies":{"find-up":{"version":"3.0.0"},"read-pkg":{"version":"5.2.0","dependencies":{"@types/normalize-package-data":{"version":"2.4.0"},"normalize-package-data":{"version":"2.5.0","dependencies":{"hosted-git-info":{"version":"2.8.8"},"semver":{"version":"5.7.1"},"resolve":{"version":"1.19.0"},"validate-npm-package-license":{"version":"3.0.4","dependencies":{"spdx-correct":{"version":"3.1.1","dependencies":{"spdx-expression-parse":{"version":"3.0.1"},"spdx-license-ids":{"version":"3.0.7"}}},"spdx-expression-parse":{"version":"3.0.1","dependencies":{"spdx-exceptions":{"version":"2.3.0"},"spdx-license-ids":{"version":"3.0.7"}}}}}}},"parse-json":{"version":"5.1.0","dependencies":{"@babel/code-frame":{"version":"7.10.4","dependencies":{"@babel/highlight":{"version":"7.10.4","dependencies":{"@babel/helper-validator-identifier":{"version":"7.10.4"},"chalk":{"version":"2.4.2","dependencies":{"ansi-styles":{"version":"3.2.1","dependencies":{"color-convert":{"version":"1.9.3","dependencies":{"color-name":{"version":"1.1.3"}}}}},"supports-color":{"version":"5.5.0","dependencies":{"has-flag":{"version":"3.0.0"}}},"escape-string-regexp":{"version":"1.0.5"}}},"js-tokens":{"version":"4.0.0"}}}}},"error-ex":{"version":"1.3.2","dependencies":{"is-arrayish":{"version":"0.2.1"}}},"json-parse-even-better-errors":{"version":"2.3.1"},"lines-and-columns":{"version":"1.1.6"}}},"type-fest":{"version":"0.6.0"}}}}},"rimraf":{"version":"2.7.1","dependencies":{"glob":{"version":"7.1.6"}}},"run-async":{"version":"2.4.1"},"semver":{"version":"7.3.4","dependencies":{"lru-cache":{"version":"6.0.0","dependencies":{"yallist":{"version":"4.0.0"}}}}},"shelljs":{"version":"0.8.4","dependencies":{"glob":{"version":"7.1.6"},"interpret":{"version":"1.4.0"},"rechoir":{"version":"0.6.2","dependencies":{"resolve":{"version":"1.19.0","dependencies":{"is-core-module":{"version":"2.2.0","dependencies":{"has":{"version":"1.0.3","dependencies":{"function-bind":{"version":"1.1.1"}}}}},"path-parse":{"version":"1.0.6"}}}}}}},"text-table":{"version":"0.2.0"},"through2":{"version":"3.0.2","dependencies":{"inherits":{"version":"2.0.4"},"readable-stream":{"version":"3.6.0","dependencies":{"inherits":{"version":"2.0.4"},"string_decoder":{"version":"1.3.0","dependencies":{"safe-buffer":{"version":"5.2.1"}}},"util-deprecate":{"version":"1.0.2"}}}}},"yeoman-environment":{"version":"2.10.3","dependencies":{"escape-string-regexp":{"version":"1.0.5"},"execa":{"version":"4.1.0","dependencies":{"cross-spawn":{"version":"7.0.3","dependencies":{"path-key":{"version":"3.1.1"},"shebang-command":{"version":"2.0.0","dependencies":{"shebang-regex":{"version":"3.0.0"}}},"which":{"version":"2.0.2","dependencies":{"isexe":{"version":"2.0.0"}}}}},"get-stream":{"version":"5.2.0","dependencies":{"pump":{"version":"3.0.0","dependencies":{"end-of-stream":{"version":"1.4.4","dependencies":{"once":{"version":"1.4.0"}}},"once":{"version":"1.4.0"}}}}},"is-stream":{"version":"2.0.0"},"human-signals":{"version":"1.1.1"},"merge-stream":{"version":"2.0.0"},"npm-run-path":{"version":"4.0.1","dependencies":{"path-key":{"version":"3.1.1"}}},"onetime":{"version":"5.1.2","dependencies":{"mimic-fn":{"version":"2.1.0"}}},"signal-exit":{"version":"3.0.3"},"strip-final-newline":{"version":"2.0.0"}}},"grouped-queue":{"version":"1.1.0"},"inquirer":{"version":"7.3.3","dependencies":{"ansi-escapes":{"version":"4.3.1","dependencies":{"type-fest":{"version":"0.11.0"}}},"cli-cursor":{"version":"3.1.0","dependencies":{"restore-cursor":{"version":"3.1.0","dependencies":{"onetime":{"version":"5.1.2"},"signal-exit":{"version":"3.0.3"}}}}},"cli-width":{"version":"3.0.0"},"external-editor":{"version":"3.1.0","dependencies":{"chardet":{"version":"0.7.0"},"iconv-lite":{"version":"0.4.24","dependencies":{"safer-buffer":{"version":"2.1.2"}}},"tmp":{"version":"0.0.33","dependencies":{"os-tmpdir":{"version":"1.0.2"}}}}},"figures":{"version":"3.2.0","dependencies":{"escape-string-regexp":{"version":"1.0.5"}}},"chalk":{"version":"4.1.0","dependencies":{"ansi-styles":{"version":"4.3.0","dependencies":{"color-convert":{"version":"2.0.1","dependencies":{"color-name":{"version":"1.1.4"}}}}},"supports-color":{"version":"7.2.0","dependencies":{"has-flag":{"version":"4.0.0"}}}}},"lodash":{"version":"4.17.20"},"mute-stream":{"version":"0.0.8"},"run-async":{"version":"2.4.1"},"rxjs":{"version":"6.6.3","dependencies":{"tslib":{"version":"1.14.1"}}},"string-width":{"version":"4.2.0"},"strip-ansi":{"version":"6.0.0"},"through":{"version":"2.3.8"}}},"is-scoped":{"version":"1.0.0","dependencies":{"scoped-regex":{"version":"1.0.0"}}},"lodash":{"version":"4.17.20"},"log-symbols":{"version":"2.2.0","dependencies":{"chalk":{"version":"2.4.2","dependencies":{"escape-string-regexp":{"version":"1.0.5"},"ansi-styles":{"version":"3.2.1","dependencies":{"color-convert":{"version":"1.9.3","dependencies":{"color-name":{"version":"1.1.3"}}}}},"supports-color":{"version":"5.5.0","dependencies":{"has-flag":{"version":"3.0.0"}}}}}}},"mem-fs":{"version":"1.2.0","dependencies":{"through2":{"version":"3.0.2"},"vinyl":{"version":"2.2.1"},"vinyl-file":{"version":"3.0.0","dependencies":{"graceful-fs":{"version":"4.2.4"},"strip-bom-buf":{"version":"1.0.0","dependencies":{"is-utf8":{"version":"0.2.1"}}},"strip-bom-stream":{"version":"2.0.0","dependencies":{"first-chunk-stream":{"version":"2.0.0","dependencies":{"readable-stream":{"version":"2.3.7","dependencies":{"core-util-is":{"version":"1.0.2"},"safe-buffer":{"version":"5.1.2"},"string_decoder":{"version":"1.1.1","dependencies":{"safe-buffer":{"version":"5.1.2"}}},"inherits":{"version":"2.0.4"},"isarray":{"version":"1.0.0"},"process-nextick-args":{"version":"2.0.1"},"util-deprecate":{"version":"1.0.2"}}}}},"strip-bom":{"version":"2.0.0","dependencies":{"is-utf8":{"version":"0.2.1"}}}}},"vinyl":{"version":"2.2.1"},"pify":{"version":"2.3.0"}}}}},"mem-fs-editor":{"version":"6.0.0"},"npm-api":{"version":"1.0.0","dependencies":{"JSONStream":{"version":"1.3.5","dependencies":{"jsonparse":{"version":"1.3.1"},"through":{"version":"2.3.8"}}},"clone-deep":{"version":"4.0.1","dependencies":{"is-plain-object":{"version":"2.0.4","dependencies":{"isobject":{"version":"3.0.1"}}},"kind-of":{"version":"6.0.3"},"shallow-clone":{"version":"3.0.1","dependencies":{"kind-of":{"version":"6.0.3"}}}}},"download-stats":{"version":"0.3.4","dependencies":{"JSONStream":{"version":"1.3.5"},"lazy-cache":{"version":"2.0.2","dependencies":{"set-getter":{"version":"0.1.0","dependencies":{"to-object-path":{"version":"0.3.0","dependencies":{"kind-of":{"version":"3.2.2","dependencies":{"is-buffer":{"version":"1.1.6"}}}}}}}}},"moment":{"version":"2.29.1"}}},"moment":{"version":"2.29.1"},"paged-request":{"version":"2.0.1","dependencies":{"axios":{"version":"0.18.1","dependencies":{"is-buffer":{"version":"2.0.5"},"follow-redirects":{"version":"1.5.10","dependencies":{"debug":{"version":"3.1.0","dependencies":{"ms":{"version":"2.0.0"}}}}}}}}},"request":{"version":"2.88.2","dependencies":{"aws-sign2":{"version":"0.7.0"},"aws4":{"version":"1.11.0"},"caseless":{"version":"0.12.0"},"combined-stream":{"version":"1.0.8","dependencies":{"delayed-stream":{"version":"1.0.0"}}},"extend":{"version":"3.0.2"},"forever-agent":{"version":"0.6.1"},"form-data":{"version":"2.3.3","dependencies":{"asynckit":{"version":"0.4.0"},"combined-stream":{"version":"1.0.8"},"mime-types":{"version":"2.1.27"}}},"har-validator":{"version":"5.1.5","dependencies":{"ajv":{"version":"6.12.6","dependencies":{"fast-deep-equal":{"version":"3.1.3"},"fast-json-stable-stringify":{"version":"2.1.0"},"json-schema-traverse":{"version":"0.4.1"},"uri-js":{"version":"4.4.0","dependencies":{"punycode":{"version":"2.1.1"}}}}},"har-schema":{"version":"2.0.0"}}},"http-signature":{"version":"1.2.0","dependencies":{"assert-plus":{"version":"1.0.0"},"jsprim":{"version":"1.4.1","dependencies":{"assert-plus":{"version":"1.0.0"},"extsprintf":{"version":"1.3.0"},"json-schema":{"version":"0.2.3"},"verror":{"version":"1.10.0","dependencies":{"assert-plus":{"version":"1.0.0"},"core-util-is":{"version":"1.0.2"},"extsprintf":{"version":"1.3.0"}}}}},"sshpk":{"version":"1.16.1","dependencies":{"asn1":{"version":"0.2.4","dependencies":{"safer-buffer":{"version":"2.1.2"}}},"assert-plus":{"version":"1.0.0"},"bcrypt-pbkdf":{"version":"1.0.2","dependencies":{"tweetnacl":{"version":"0.14.5"}}},"dashdash":{"version":"1.14.1","dependencies":{"assert-plus":{"version":"1.0.0"}}},"ecc-jsbn":{"version":"0.1.2","dependencies":{"jsbn":{"version":"0.1.1"},"safer-buffer":{"version":"2.1.2"}}},"getpass":{"version":"0.1.7","dependencies":{"assert-plus":{"version":"1.0.0"}}},"jsbn":{"version":"0.1.1"},"safer-buffer":{"version":"2.1.2"},"tweetnacl":{"version":"0.14.5"}}}}},"is-typedarray":{"version":"1.0.0"},"isstream":{"version":"0.1.2"},"json-stringify-safe":{"version":"5.0.1"},"mime-types":{"version":"2.1.27","dependencies":{"mime-db":{"version":"1.44.0"}}},"oauth-sign":{"version":"0.9.0"},"performance-now":{"version":"2.1.0"},"qs":{"version":"6.5.2"},"uuid":{"version":"3.4.0"},"safe-buffer":{"version":"5.2.1"},"tough-cookie":{"version":"2.5.0","dependencies":{"psl":{"version":"1.8.0"},"punycode":{"version":"2.1.1"}}},"tunnel-agent":{"version":"0.6.0","dependencies":{"safe-buffer":{"version":"5.2.1"}}}}}}},"semver":{"version":"7.3.4"},"text-table":{"version":"0.2.0"},"untildify":{"version":"3.0.3"},"chalk":{"version":"2.4.2","dependencies":{"escape-string-regexp":{"version":"1.0.5"},"ansi-styles":{"version":"3.2.1","dependencies":{"color-convert":{"version":"1.9.3","dependencies":{"color-name":{"version":"1.1.3"}}}}},"supports-color":{"version":"5.5.0","dependencies":{"has-flag":{"version":"3.0.0"}}}}},"debug":{"version":"3.2.7","dependencies":{"ms":{"version":"2.1.2"}}},"diff":{"version":"3.5.0"},"globby":{"version":"8.0.2","dependencies":{"array-union":{"version":"1.0.2"},"fast-glob":{"version":"2.2.7"},"glob":{"version":"7.1.6"},"dir-glob":{"version":"2.0.0","dependencies":{"path-type":{"version":"3.0.0"},"arrify":{"version":"1.0.1"}}},"ignore":{"version":"3.3.10"},"pify":{"version":"3.0.0"},"slash":{"version":"1.0.0"}}},"strip-ansi":{"version":"4.0.0","dependencies":{"ansi-regex":{"version":"3.0.0"}}},"yeoman-generator":{"version":"4.10.1"}}},"chalk":{"version":"2.4.2","dependencies":{"escape-string-regexp":{"version":"1.0.5"},"ansi-styles":{"version":"3.2.1","dependencies":{"color-convert":{"version":"1.9.3","dependencies":{"color-name":{"version":"1.1.3"}}}}},"supports-color":{"version":"5.5.0","dependencies":{"has-flag":{"version":"3.0.0"}}}}}}}}}
\ No newline at end of file
diff --git a/libraries/bot-ai-luis-v3/pom.xml b/libraries/bot-ai-luis-v3/pom.xml
new file mode 100644
index 000000000..c5d73f696
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/pom.xml
@@ -0,0 +1,99 @@
+
+
+ 4.0.0
+
+
+ com.microsoft.bot
+ bot-java
+ 4.15.0-SNAPSHOT
+ ../../pom.xml
+
+
+ bot-ai-luis-v3
+ jar
+
+ ${project.groupId}:${project.artifactId}
+ Bot Framework Luis V3
+ https://dev.botframework.com/
+
+
+
+ MIT License
+ http://www.opensource.org/licenses/mit-license.php
+
+
+
+
+
+ Bot Framework Development
+
+ Microsoft
+ https://dev.botframework.com/
+
+
+
+
+ scm:git:https://github.com/Microsoft/botbuilder-java
+ scm:git:https://github.com/Microsoft/botbuilder-java
+ https://github.com/Microsoft/botbuilder-java
+
+
+
+ UTF-8
+ false
+
+
+
+
+ junit
+ junit
+ test
+
+
+ org.mockito
+ mockito-core
+ test
+
+
+ org.slf4j
+ slf4j-api
+
+
+
+ com.microsoft.bot
+ bot-builder
+
+
+ com.microsoft.bot
+ bot-dialogs
+
+
+ com.squareup.okhttp3
+ okhttp
+
+
+ com.squareup.okhttp3
+ mockwebserver
+ test
+
+
+ org.json
+ json
+ 20190722
+
+
+
+
+
+ build
+
+ true
+
+
+
+
+
+
+
+
diff --git a/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/DynamicList.java b/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/DynamicList.java
new file mode 100644
index 000000000..770ada836
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/DynamicList.java
@@ -0,0 +1,90 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package com.microsoft.bot.ai.luis;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.util.List;
+
+/**
+ * Request Body element to use when passing Dynamic lists to the Luis Service
+ * call. Defines an extension for a list entity.
+ *
+ */
+public class DynamicList {
+
+ /**
+ * Initializes a new instance of the DynamicList class.
+ */
+ public DynamicList() {
+ }
+
+ /**
+ * Initializes a new instance of the DynamicList class.
+ *
+ * @param entity Entity field.
+ * @param requestLists List Elements to use when querying Luis Service.
+ */
+ public DynamicList(String entity, List requestLists) {
+ this.entity = entity;
+ this.list = requestLists;
+ }
+
+ @JsonProperty(value = "listEntityName")
+ private String entity;
+
+ @JsonProperty(value = "requestLists")
+ private List list;
+
+ /**
+ * Gets the name of the list entity to extend.
+ *
+ * @return The name of the list entity to extend.
+ */
+ public String getEntity() {
+ return entity;
+ }
+
+ /**
+ * Sets the name of the list entity to extend.
+ *
+ * @param entity The name of the list entity to extend.
+ */
+ public void setEntity(String entity) {
+ this.entity = entity;
+ }
+
+ /**
+ * Gets the lists to append on the extended list entity.
+ *
+ * @return The lists to append on the extended list entity.
+ */
+ public List getList() {
+ return list;
+ }
+
+ /**
+ * Sets the lists to append on the extended list entity.
+ *
+ * @param list The lists to append on the extended list entity.
+ */
+ public void setList(List list) {
+ this.list = list;
+ }
+
+ /**
+ * Validate the object.
+ *
+ * @throws IllegalArgumentException on null or invalid values.
+ */
+ public void validate() throws IllegalArgumentException {
+ // Required: ListEntityName, RequestLists
+ if (entity == null || list == null) {
+ throw new IllegalArgumentException("DynamicList requires listEntityName and requestsLists to be defined.");
+ }
+
+ for (ListElement e : list) {
+ e.validate();
+ }
+ }
+}
diff --git a/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/ExternalEntity.java b/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/ExternalEntity.java
new file mode 100644
index 000000000..255824843
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/ExternalEntity.java
@@ -0,0 +1,135 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package com.microsoft.bot.ai.luis;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.JsonNode;
+
+/**
+ * Request Body element to use when passing External Entities to the Luis
+ * Service call. Defines a user predicted entity that extends an already
+ * existing one.
+ *
+ */
+public class ExternalEntity {
+
+ /**
+ * Initializes a new instance of ExternalEntity.
+ */
+ public ExternalEntity() {
+ }
+
+ /**
+ * Initializes a new instance of ExternalEntity.
+ *
+ * @param entity name of the entity to extend.
+ * @param start start character index of the predicted entity.
+ * @param length length of the predicted entity.
+ * @param resolution supplied custom resolution to return as the entity's
+ * prediction.
+ */
+ public ExternalEntity(String entity, int start, int length, JsonNode resolution) {
+ this.entity = entity;
+ this.start = start;
+ this.length = length;
+ this.resolution = resolution;
+ }
+
+ @JsonProperty(value = "entityName")
+ private String entity;
+
+ @JsonProperty(value = "startIndex")
+ private int start;
+
+ @JsonProperty(value = "entityLength")
+ private int length;
+
+ @JsonProperty(value = "resolution")
+ private JsonNode resolution;
+
+ /**
+ * Gets the start character index of the predicted entity.
+ *
+ * @return The start character index of the predicted entity.
+ */
+ public int getStart() {
+ return start;
+ }
+
+ /**
+ * Sets the start character index of the predicted entity.
+ *
+ * @param start The start character index of the predicted entity.
+ */
+ public void setStart(int start) {
+ this.start = start;
+ }
+
+ /**
+ * Gets the name of the entity to extend.
+ *
+ * @return The name of the entity to extend.
+ */
+ public String getEntity() {
+ return entity;
+ }
+
+ /**
+ * Sets the name of the entity to extend.
+ *
+ * @param entity The name of the entity to extend.
+ */
+ public void setEntity(String entity) {
+ this.entity = entity;
+ }
+
+ /**
+ * Gets the length of the predicted entity.
+ *
+ * @return The length of the predicted entity.
+ */
+ public int getLength() {
+ return length;
+ }
+
+ /**
+ * Sets the length of the predicted entity.
+ *
+ * @param length The length of the predicted entity.
+ */
+ public void setLength(int length) {
+ this.length = length;
+ }
+
+ /**
+ * Gets a user supplied custom resolution to return as the entity's prediction.
+ *
+ * @return A user supplied custom resolution to return as the entity's
+ * prediction.
+ */
+ public JsonNode getResolution() {
+ return resolution;
+ }
+
+ /**
+ * Sets a user supplied custom resolution to return as the entity's prediction.
+ *
+ * @param resolution A user supplied custom resolution to return as the entity's
+ * prediction.
+ */
+ public void setResolution(JsonNode resolution) {
+ this.resolution = resolution;
+ }
+
+ /**
+ * Validate the object.
+ *
+ * @throws IllegalArgumentException on null or invalid values
+ */
+ public void validate() throws IllegalArgumentException {
+ if (entity == null || length == 0) {
+ throw new IllegalArgumentException("ExternalEntity requires an EntityName and EntityLength > 0");
+ }
+ }
+}
diff --git a/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/ListElement.java b/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/ListElement.java
new file mode 100644
index 000000000..edd498ac0
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/ListElement.java
@@ -0,0 +1,95 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package com.microsoft.bot.ai.luis;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.List;
+
+/**
+ * List Element for Dynamic Lists. Defines a sub-list to append to an existing
+ * list entity.
+ *
+ */
+public class ListElement {
+
+ /**
+ * Initializes a new instance of the ListElement class.
+ */
+ public ListElement() {
+ }
+
+ /**
+ * Initializes a new instance of the ListElement class.
+ *
+ * @param canonicalForm The canonical form of the sub-list.
+ * @param synonyms The synonyms of the canonical form.
+ */
+ public ListElement(String canonicalForm, List synonyms) {
+ this.canonicalForm = canonicalForm;
+ this.synonyms = synonyms;
+ }
+
+ /**
+ * The canonical form of the sub-list.
+ */
+ @JsonProperty(value = "canonicalForm")
+ private String canonicalForm;
+
+ /**
+ * The synonyms of the canonical form.
+ */
+ @JsonProperty(value = "synonyms")
+ @JsonInclude(JsonInclude.Include.NON_NULL)
+ private List synonyms;
+
+ /**
+ * Gets the canonical form of the sub-list.
+ *
+ * @return String canonical form of the sub-list.
+ */
+ public String getCanonicalForm() {
+ return canonicalForm;
+ }
+
+ /**
+ * Sets the canonical form of the sub-list.
+ *
+ * @param canonicalForm the canonical form of the sub-list.
+ */
+ public void setCanonicalForm(String canonicalForm) {
+ this.canonicalForm = canonicalForm;
+ }
+
+ /**
+ * Gets the synonyms of the canonical form.
+ *
+ * @return the synonyms List of the canonical form.
+ */
+ public List getSynonyms() {
+ return synonyms;
+ }
+
+ /**
+ * Sets the synonyms of the canonical form.
+ *
+ * @param synonyms List of synonyms of the canonical form.
+ */
+ public void setSynonyms(List synonyms) {
+ this.synonyms = synonyms;
+ }
+
+ /**
+ * Validate the object.
+ *
+ * @throws IllegalArgumentException if canonicalForm is null.
+ */
+ public void validate() throws IllegalArgumentException {
+ if (canonicalForm == null) {
+ throw new IllegalArgumentException("RequestList requires CanonicalForm to be defined.");
+ }
+ }
+
+}
diff --git a/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/LuisApplication.java b/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/LuisApplication.java
new file mode 100644
index 000000000..ad7c575aa
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/LuisApplication.java
@@ -0,0 +1,203 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package com.microsoft.bot.ai.luis;
+
+import okhttp3.HttpUrl;
+import java.net.MalformedURLException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.UUID;
+
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * Luis Application representation with information necessary to query the
+ * specific Luis Application. Data describing a LUIS application.
+ *
+ */
+public class LuisApplication {
+
+ /**
+ * LUIS application ID.
+ */
+ private String applicationId;
+
+ /**
+ * LUIS subscription or endpoint key.
+ */
+ private String endpointKey;
+
+ /**
+ * LUIS endpoint like https://westus.api.cognitive.microsoft.com.
+ */
+ private String endpoint;
+
+ /**
+ * Initializes a new instance of the Luis Application class.
+ */
+ public LuisApplication() {
+ }
+
+ /**
+ * Initializes a new instance of the Luis Application class.
+ *
+ * @param applicationId Luis Application ID to query
+ * @param endpointKey LUIS subscription or endpoint key.
+ * @param endpoint LUIS endpoint to use like
+ * https://westus.api.cognitive.microsoft.com
+ */
+ public LuisApplication(String applicationId, String endpointKey, String endpoint) {
+ setLuisApplication(applicationId, endpointKey, endpoint);
+ }
+
+ /**
+ * Initializes a new instance of the Luis Application class.
+ *
+ * @param applicationEndpoint LUIS application query endpoint containing
+ * subscription key and application id as part of the
+ * url.
+ */
+ public LuisApplication(String applicationEndpoint) {
+ parse(applicationEndpoint);
+ }
+
+ /**
+ * Sets Luis application ID to query.
+ *
+ * @param applicationId Luis application ID to query.
+ */
+ public void setApplicationId(String applicationId) {
+ this.applicationId = applicationId;
+ }
+
+ /**
+ * Gets LUIS application ID.
+ *
+ * @return LUIS application ID.
+ */
+ public String getApplicationId() {
+ return applicationId;
+ }
+
+ /**
+ * Sets the LUIS subscription or endpoint key.
+ *
+ * @param endpointKey LUIS subscription or endpoint key.
+ */
+ public void setEndpointKey(String endpointKey) {
+ this.endpointKey = endpointKey;
+ }
+
+ /**
+ * Gets the LUIS subscription or endpoint key.
+ *
+ * @return LUIS subscription or endpoint key.
+ */
+ public String getEndpointKey() {
+ return endpointKey;
+ }
+
+ /**
+ * Sets LUIS endpoint like https://westus.api.cognitive.microsoft.com.
+ *
+ * @param endpoint LUIS endpoint where application is hosted.
+ */
+ public void setEndpoint(String endpoint) {
+ this.endpoint = endpoint;
+ }
+
+ /**
+ * Gets the LUIS endpoint where application is hosted.
+ *
+ * @return LUIS endpoint where application is hosted.
+ */
+ public String getEndpoint() {
+ return endpoint;
+ }
+
+ /**
+ * Helper method to set and validate Luis arguments passed.
+ */
+ private void setLuisApplication(String applicationId, String endpointKey, String endpoint) {
+
+ if (!isValidUUID(applicationId)) {
+ throw new IllegalArgumentException(String.format("%s is not a valid LUIS application id.", applicationId));
+ }
+
+ if (!isValidUUID(endpointKey)) {
+ throw new IllegalArgumentException(String.format("%s is not a valid LUIS subscription key.", endpointKey));
+ }
+
+ if (StringUtils.isBlank(endpoint)) {
+ endpoint = "https://westus.api.cognitive.microsoft.com";
+ }
+
+ if (!isValidURL(endpoint)) {
+ throw new IllegalArgumentException(String.format("%s is not a valid LUIS endpoint.", endpoint));
+ }
+
+ this.applicationId = applicationId;
+ this.endpointKey = endpointKey;
+ this.endpoint = endpoint;
+ }
+
+ /**
+ * Helper method to parse validate and set Luis application members from the
+ * full application full endpoint.
+ */
+ private void parse(String applicationEndpoint) {
+ String appId = "";
+ try {
+ String[] segments = new URL(applicationEndpoint).getPath().split("/");
+ for (int segment = 0; segment < segments.length - 1; segment++) {
+ if (segments[segment].equals("apps")) {
+ appId = segments[segment + 1].trim();
+ break;
+ }
+ }
+ } catch (MalformedURLException e) {
+ throw new IllegalArgumentException(
+ String.format("Unable to create the LUIS endpoint with the given %s.", applicationEndpoint));
+ }
+
+ if (appId.isEmpty()) {
+ throw new IllegalArgumentException(
+ String.format("Could not find application Id in %s", applicationEndpoint));
+ }
+
+ try {
+ String endpointKeyParsed = HttpUrl.parse(applicationEndpoint).queryParameterValues("subscription-key")
+ .stream().findFirst().orElse("");
+
+ String endpointPared = String.format("%s://%s", new URL(applicationEndpoint).getProtocol(),
+ new URL(applicationEndpoint).toURI().getHost());
+
+ setLuisApplication(appId, endpointKeyParsed, endpointPared);
+ } catch (URISyntaxException | MalformedURLException e) {
+ throw new IllegalArgumentException(
+ String.format("Unable to create the LUIS endpoint with the given %s.", applicationEndpoint));
+ }
+
+ }
+
+ private boolean isValidUUID(String uuid) {
+ try {
+ if (!uuid.contains("-")) {
+ uuid = uuid.replaceAll("(.{8})(.{4})(.{4})(.{4})(.+)", "$1-$2-$3-$4-$5");
+ }
+
+ return UUID.fromString(uuid).toString().equals(uuid);
+ } catch (IllegalArgumentException e) {
+ return false;
+ }
+ }
+
+ private boolean isValidURL(String uri) {
+ try {
+ return new URL(uri).toURI().isAbsolute();
+ } catch (URISyntaxException | MalformedURLException exception) {
+ return false;
+ }
+ }
+}
diff --git a/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/LuisRecognizer.java b/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/LuisRecognizer.java
new file mode 100644
index 000000000..46b007c2e
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/LuisRecognizer.java
@@ -0,0 +1,570 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package com.microsoft.bot.ai.luis;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.microsoft.bot.builder.IntentScore;
+import com.microsoft.bot.builder.NullBotTelemetryClient;
+import com.microsoft.bot.builder.RecognizerConvert;
+import com.microsoft.bot.builder.RecognizerResult;
+import com.microsoft.bot.builder.TurnContext;
+import com.microsoft.bot.dialogs.DialogContext;
+import com.microsoft.bot.schema.Activity;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * Luis Recognizer class to query the LUIS Service using the configuration set
+ * by the LuisRecognizeroptions. A LUIS based implementation of
+ * TelemetryRecognizer.
+ */
+public class LuisRecognizer extends TelemetryRecognizer {
+ /**
+ * Luis Recognizer options to query the Luis Service.
+ */
+ private LuisRecognizerOptions luisRecognizerOptions;
+
+ /**
+ * Initializes a new instance of the Luis Recognizer.
+ *
+ * @param recognizerOptions Luis Recognizer options to use when calling the LUIS
+ * Service.
+ * @throws IllegalArgumentException if null is passed as recognizerOptions.
+ */
+ public LuisRecognizer(LuisRecognizerOptions recognizerOptions) {
+ if (recognizerOptions == null) {
+ throw new IllegalArgumentException("Recognizer Options cannot be null");
+ }
+
+ this.luisRecognizerOptions = recognizerOptions;
+ this.setTelemetryClient(recognizerOptions.getTelemetryClient() != null ? recognizerOptions.getTelemetryClient()
+ : new NullBotTelemetryClient());
+ this.setLogPersonalInformation(recognizerOptions.isLogPersonalInformation());
+ }
+
+ /**
+ * Returns the name of the top scoring intent from a set of LUIS results.
+ *
+ * @param results The Recognizer Result with the list of Intents to filter.
+ * Defaults to a value of "None" and a min score value of `0.0`
+ * @return The top scoring intent name.
+ */
+ public static String topIntent(RecognizerResult results) {
+ return topIntent(results, "None");
+ }
+
+ /**
+ * Returns the name of the top scoring intent from a set of LUIS results.
+ *
+ * @param results The Recognizer Result with the list of Intents to filter
+ * @param defaultIntent Intent name to return should a top intent be found.
+ * Defaults to a value of "None" and a min score value of
+ * `0.0`
+ * @return The top scoring intent name.
+ */
+ public static String topIntent(RecognizerResult results, String defaultIntent) {
+ return topIntent(results, defaultIntent, 0.0);
+ }
+
+ /**
+ * Returns the name of the top scoring intent from a set of LUIS results.
+ *
+ * @param results The Recognizer Result with the list of Intents to filter.
+ * @param minScore Minimum score needed for an intent to be considered as a top
+ * intent.
+ * @return The top scoring intent name.
+ */
+ public static String topIntent(RecognizerResult results, double minScore) {
+ return topIntent(results, "None", minScore);
+ }
+
+ /**
+ * Returns the name of the top scoring intent from a set of LUIS results.
+ *
+ * @param results The Recognizer Result with the list of Intents to filter
+ * @param defaultIntent Intent name to return should a top intent be found.
+ * Defaults to a value of "None
+ * @param minScore Minimum score needed for an intent to be considered as a
+ * top intent.
+ * @return The top scoring intent name.
+ */
+ public static String topIntent(RecognizerResult results, String defaultIntent, double minScore) {
+ if (results == null) {
+ throw new IllegalArgumentException("RecognizerResult");
+ }
+
+ defaultIntent = defaultIntent == null || defaultIntent.equals("") ? "None" : defaultIntent;
+
+ String topIntent = null;
+ double topScore = -1.0;
+ if (!results.getIntents().isEmpty()) {
+ for (Map.Entry intent : results.getIntents().entrySet()) {
+
+ double score = intent.getValue().getScore();
+ if (score > topScore && score >= minScore) {
+ topIntent = intent.getKey();
+ topScore = score;
+ }
+ }
+ }
+
+ return StringUtils.isNotBlank(topIntent) ? topIntent : defaultIntent;
+ }
+
+ /**
+ * Return results of the analysis (Suggested actions and intents).
+ *
+ * @param turnContext Context object containing information for a single turn of
+ * conversation with a user.
+ * @return The LUIS results of the analysis of the current message text in the
+ * current turn's context activity.
+ */
+ @Override
+ public CompletableFuture recognize(TurnContext turnContext) {
+ return recognizeInternal(turnContext, null, null, null);
+ }
+
+ /**
+ * Return results of the analysis (Suggested actions and intents).
+ *
+ * @param dialogContext Context object containing information for a single turn
+ * of conversation with a user.
+ * @param activity Activity to recognize.
+ * @return The LUIS results of the analysis of the current message text in the
+ * current turn's context activity.
+ */
+ public CompletableFuture recognize(DialogContext dialogContext, Activity activity) {
+ return recognizeInternal(dialogContext, activity, null, null, null);
+ }
+
+ /**
+ * Runs an utterance through a recognizer and returns a strongly-typed
+ * recognizer result.
+ *
+ * @param turnContext Context object containing information for a single turn of
+ * conversation with a user.
+ * @param type of result.
+ * @param c RecognizerConvert implemented class to convert the
+ * Recognizer Result into.
+ * @return The LUIS results of the analysis of the current message text in the
+ * current turn's context activity.
+ */
+ public CompletableFuture recognize(TurnContext turnContext, Class c) {
+ return recognizeInternal(turnContext, null, null, null)
+ .thenApply(recognizerResult -> convertRecognizerResult(recognizerResult, c));
+ }
+
+ /**
+ * Runs an utterance through a recognizer and returns a strongly-typed
+ * recognizer result.
+ *
+ * @param dialogContext Context object containing information for a single turn
+ * of conversation with a user.
+ * @param activity Activity to recognize.
+ * @param Type of result.
+ * @param c RecognizerConvert implemented class to convert the
+ * Recognizer Result into.
+ * @return The LUIS results of the analysis of the current message text in the
+ * current turn's context activity.
+ */
+ public CompletableFuture recognize(DialogContext dialogContext, Activity activity,
+ Class c) {
+ return recognizeInternal(dialogContext, activity, null, null, null)
+ .thenApply(recognizerResult -> convertRecognizerResult(recognizerResult, c));
+ }
+
+ /**
+ * Return results of the analysis (Suggested actions and intents).
+ *
+ * @param turnContext Context object containing information for a single
+ * turn of conversation with a user.
+ * @param telemetryProperties Additional properties to be logged to telemetry
+ * with the LuisResult event.
+ * @param telemetryMetrics Additional metrics to be logged to telemetry with
+ * the LuisResult event.
+ * @return The LUIS results of the analysis of the current message text in the
+ * current turn's context activity.
+ */
+ @Override
+ public CompletableFuture recognize(TurnContext turnContext,
+ Map telemetryProperties, Map telemetryMetrics) {
+ return recognizeInternal(turnContext, null, telemetryProperties, telemetryMetrics);
+ }
+
+ /**
+ * Return results of the analysis (Suggested actions and intents).
+ *
+ * @param dialogContext Context object containing information for a single
+ * turn of conversation with a user.
+ * @param activity Activity to recognize.
+ * @param telemetryProperties Additional properties to be logged to telemetry
+ * with the LuisResult event.
+ * @param telemetryMetrics Additional metrics to be logged to telemetry with
+ * the LuisResult event.
+ * @return The LUIS results of the analysis of the current message text in the
+ * current turn's context activity.
+ */
+ public CompletableFuture recognize(DialogContext dialogContext, Activity activity,
+ Map telemetryProperties, Map telemetryMetrics) {
+ return recognizeInternal(dialogContext, activity, null, telemetryProperties, telemetryMetrics);
+ }
+
+ /**
+ * Runs an utterance through a recognizer and returns a strongly-typed
+ * recognizer result.
+ *
+ * @param turnContext Context object containing information for a single
+ * turn of conversation with a user.
+ * @param telemetryProperties Additional properties to be logged to telemetry
+ * with the LuisResult event.
+ * @param telemetryMetrics Additional metrics to be logged to telemetry with
+ * the LuisResult event.
+ * @param Type of result.
+ * @param c RecognizerConvert implemented class to convert the
+ * Recognizer Result into.
+ * @return The LUIS results of the analysis of the current message text in the
+ * current turn's context activity.
+ */
+ public CompletableFuture recognize(TurnContext turnContext,
+ Map telemetryProperties, Map telemetryMetrics, Class c) {
+ return recognizeInternal(turnContext, null, telemetryProperties, telemetryMetrics)
+ .thenApply(recognizerResult -> convertRecognizerResult(recognizerResult, c));
+ }
+
+ /**
+ * Runs an utterance through a recognizer and returns a strongly-typed
+ * recognizer result.
+ *
+ * @param dialogContext Context object containing information for a single
+ * turn of conversation with a user.
+ * @param activity Activity to recognize.
+ * @param telemetryProperties Additional properties to be logged to telemetry
+ * with the LuisResult event.
+ * @param telemetryMetrics Additional metrics to be logged to telemetry with
+ * the LuisResult event.
+ * @param Type of result.
+ * @param c RecognizerConvert implemented class to convert the
+ * Recognizer Result into.
+ * @return The LUIS results of the analysis of the current message text in the
+ * current turn's context activity.
+ */
+ public CompletableFuture recognize(DialogContext dialogContext, Activity activity,
+ Map telemetryProperties, Map telemetryMetrics, Class c) {
+ return recognizeInternal(dialogContext, activity, null, telemetryProperties, telemetryMetrics)
+ .thenApply(recognizerResult -> convertRecognizerResult(recognizerResult, c));
+ }
+
+ /**
+ * Return results of the analysis (Suggested actions and intents).
+ *
+ * @param turnContext Context object containing information for a single
+ * turn of conversation with a user.
+ * @param recognizerOptions A LuisRecognizerOptions instance to be used by the
+ * call. This parameter overrides the default
+ * LuisRecognizerOptions passed in the constructor.
+ * @return The LUIS results of the analysis of the current message text in the
+ * current turn's context activity.
+ */
+ public CompletableFuture recognize(TurnContext turnContext,
+ LuisRecognizerOptions recognizerOptions) {
+ return recognizeInternal(turnContext, recognizerOptions, null, null);
+ }
+
+ /**
+ * Return results of the analysis (Suggested actions and intents).
+ *
+ * @param dialogContext Context object containing information for a single
+ * turn of conversation with a user.
+ * @param activity Activity to recognize.
+ * @param recognizerOptions A LuisRecognizerOptions instance to be used by the
+ * call. This parameter overrides the default
+ * LuisRecognizerOptions passed in the constructor.
+ * @return The LUIS results of the analysis of the current message text in the
+ * current turn's context activity.
+ */
+ public CompletableFuture recognize(DialogContext dialogContext, Activity activity,
+ LuisRecognizerOptions recognizerOptions) {
+ return recognizeInternal(dialogContext, activity, recognizerOptions, null, null);
+ }
+
+ /**
+ * Runs an utterance through a recognizer and returns a strongly-typed
+ * recognizer result.
+ *
+ * @param turnContext Context object containing information for a single
+ * turn of conversation with a user.
+ * @param recognizerOptions A LuisRecognizerOptions instance to be used by the
+ * call. This parameter overrides the default
+ * LuisRecognizerOptions passed in the constructor.
+ * @param type of result.
+ * @param c RecognizerConvert implemented class to convert the
+ * Recognizer Result into.
+ * @return The LUIS results of the analysis of the current message text in the
+ * current turn's context activity.
+ */
+ public CompletableFuture recognize(TurnContext turnContext,
+ LuisRecognizerOptions recognizerOptions, Class c) {
+ return recognizeInternal(turnContext, recognizerOptions, null, null)
+ .thenApply(recognizerResult -> convertRecognizerResult(recognizerResult, c));
+ }
+
+ /**
+ * Runs an utterance through a recognizer and returns a strongly-typed
+ * recognizer result.
+ *
+ * @param dialogContext Context object containing information for a single
+ * turn of conversation with a user.
+ * @param activity Activity to recognize.
+ * @param recognizerOptions A LuisRecognizerOptions instance to be used by the
+ * call. This parameter overrides the default
+ * LuisRecognizerOptions passed in the constructor.
+ * @param Type of result.
+ * @param c RecognizerConvert implemented class to convert the
+ * Recognizer Result into.
+ * @return The LUIS results of the analysis of the current message text in the
+ * current turn's context activity.
+ */
+ public CompletableFuture recognize(DialogContext dialogContext, Activity activity,
+ LuisRecognizerOptions recognizerOptions, Class c) {
+ return recognizeInternal(dialogContext, activity, recognizerOptions, null, null)
+ .thenApply(recognizerResult -> convertRecognizerResult(recognizerResult, c));
+ }
+
+ /**
+ * Return results of the analysis (Suggested actions and intents).
+ *
+ * @param turnContext Context object containing information for a single
+ * turn of conversation with a user.
+ * @param recognizerOptions LuisRecognizerOptions instance to be used by the
+ * call. This parameter overrides the default
+ * LuisRecognizerOptions passed in the constructor.
+ * @param telemetryProperties Additional properties to be logged to telemetry
+ * with the LuisResult event.
+ * @param telemetryMetrics Additional metrics to be logged to telemetry with
+ * the LuisResult event.
+ * @return The LUIS results of the analysis of the current message text in the
+ * current turn's context activity.
+ */
+ public CompletableFuture recognize(TurnContext turnContext,
+ LuisRecognizerOptions recognizerOptions, Map telemetryProperties,
+ Map telemetryMetrics) {
+ return recognizeInternal(turnContext, recognizerOptions, telemetryProperties, telemetryMetrics);
+ }
+
+ /**
+ * Return results of the analysis (Suggested actions and intents).
+ *
+ * @param dialogContext Context object containing information for a single
+ * turn of conversation with a user.
+ * @param activity Activity to recognize.
+ * @param recognizerOptions A LuisRecognizerOptions instance to be used by the
+ * call. This parameter overrides the default
+ * LuisRecognizerOptions passed in the constructor.
+ * @param telemetryProperties Additional properties to be logged to telemetry
+ * with the LuisResult event.
+ * @param telemetryMetrics Additional metrics to be logged to telemetry with
+ * the LuisResult event.
+ * @return The LUIS results of the analysis of the current message text in the
+ * current turn's context activity.
+ */
+ public CompletableFuture recognize(DialogContext dialogContext, Activity activity,
+ LuisRecognizerOptions recognizerOptions, Map telemetryProperties,
+ Map telemetryMetrics) {
+ return recognizeInternal(dialogContext, activity, recognizerOptions, telemetryProperties, telemetryMetrics);
+ }
+
+ /**
+ * Runs an utterance through a recognizer and returns a strongly-typed
+ * recognizer result.
+ *
+ * @param turnContext Context object containing information for a single
+ * turn of conversation with a user.
+ * @param recognizerOptions A LuisRecognizerOptions instance to be used by the
+ * call. This parameter overrides the default
+ * LuisRecognizerOptions passed in the constructor.
+ * @param telemetryProperties Additional properties to be logged to telemetry
+ * with the LuisResult event.
+ * @param telemetryMetrics Additional metrics to be logged to telemetry with
+ * the LuisResult event.
+ * @param Type of result.
+ * @param c RecognizerConvert implemented class to convert the
+ * Recognizer Result into.
+ * @return The LUIS results of the analysis of the current message text in the
+ * current turn's context activity.
+ */
+ public CompletableFuture recognize(TurnContext turnContext,
+ LuisRecognizerOptions recognizerOptions, Map telemetryProperties,
+ Map telemetryMetrics, Class c) {
+ return recognizeInternal(turnContext, recognizerOptions, telemetryProperties, telemetryMetrics)
+ .thenApply(recognizerResult -> convertRecognizerResult(recognizerResult, c));
+ }
+
+ /**
+ * Runs an utterance through a recognizer and returns a strongly-typed
+ * recognizer result.
+ *
+ * @param dialogContext Context object containing information for a single
+ * turn of conversation with a user.
+ * @param activity Activity to recognize.
+ * @param recognizerOptions LuisRecognizerOptions instance to be used by the
+ * call. This parameter overrides the default
+ * LuisRecognizerOptions passed in the constructor.
+ * @param telemetryProperties Additional properties to be logged to telemetry
+ * with the LuisResult event.
+ * @param telemetryMetrics Additional metrics to be logged to telemetry with
+ * the LuisResult event.
+ * @param Type of result.
+ * @param c RecognizerConvert implemented class to convert the
+ * Recognizer Result into.
+ * @return The LUIS results of the analysis of the current message text in the
+ * current turn's context activity.
+ */
+ public CompletableFuture recognize(DialogContext dialogContext, Activity activity,
+ LuisRecognizerOptions recognizerOptions, Map telemetryProperties,
+ Map telemetryMetrics, Class c) {
+ return recognizeInternal(dialogContext, activity, recognizerOptions, telemetryProperties, telemetryMetrics)
+ .thenApply(recognizerResult -> convertRecognizerResult(recognizerResult, c));
+ }
+
+ /**
+ * Invoked prior to a LuisResult being logged.
+ *
+ * @param recognizerResult The Luis Results for the call.
+ * @param turnContext Context object containing information for a single
+ * turn of conversation with a user.
+ * @param telemetryProperties Additional properties to be logged to telemetry
+ * with the LuisResult event.
+ * @param telemetryMetrics Additional metrics to be logged to telemetry with
+ * the LuisResult event.
+ */
+ public void onRecognizerResult(RecognizerResult recognizerResult, TurnContext turnContext,
+ Map telemetryProperties, Map telemetryMetrics) {
+ Map properties = fillLuisEventProperties(recognizerResult, turnContext,
+ telemetryProperties);
+ // Track the event
+ this.getTelemetryClient().trackEvent(LuisTelemetryConstants.LUIS_RESULT, properties, telemetryMetrics);
+ }
+
+ /**
+ * Fills the event properties for LuisResult event for telemetry.
+ * These properties are logged when the recognizer is called.
+ *
+ * @param recognizerResult Last activity sent from user.
+ * @param turnContext Context object containing information for a single turn of conversation with a user.
+ * @param telemetryProperties Additional properties to be logged to telemetry with the LuisResult event.
+ * @return
+ */
+ private Map fillLuisEventProperties(RecognizerResult recognizerResult, TurnContext turnContext,
+ Map telemetryProperties) {
+
+ Map sortedIntents = sortIntents(recognizerResult);
+ ArrayList topTwoIntents = new ArrayList<>();
+ Iterator> iterator = sortedIntents.entrySet().iterator();
+ int intentCounter = 0;
+ while (iterator.hasNext() && intentCounter < 2) {
+ intentCounter++;
+ Map.Entry intent = iterator.next();
+ topTwoIntents.add(intent.getKey());
+ }
+
+ // Add the intent score and conversation id properties
+ Map properties = new HashMap<>();
+ properties.put(LuisTelemetryConstants.APPLICATION_ID_PROPERTY,
+ luisRecognizerOptions.getApplication().getApplicationId());
+ properties.put(LuisTelemetryConstants.INTENT_PROPERTY, topTwoIntents.size() > 0 ? topTwoIntents.get(0) : "");
+ properties.put(LuisTelemetryConstants.INTENT_SCORE_PROPERTY,
+ topTwoIntents.size() > 0 ? "" + recognizerResult.getIntents().get(topTwoIntents.get(0)).getScore()
+ : "0.00");
+ properties.put(LuisTelemetryConstants.INTENT_2_PROPERTY, topTwoIntents.size() > 1 ? topTwoIntents.get(1) : "");
+ properties.put(LuisTelemetryConstants.INTENT_SCORE_2_PROPERTY,
+ topTwoIntents.size() > 1 ? "" + recognizerResult.getIntents().get(topTwoIntents.get(1)).getScore()
+ : "0.00");
+ properties.put(LuisTelemetryConstants.FROM_ID_PROPERTY, turnContext.getActivity().getFrom().getId());
+
+ if (recognizerResult.getProperties().containsKey("sentiment")) {
+ JsonNode sentiment = recognizerResult.getProperties().get("sentiment");
+ if (sentiment.has("label")) {
+ properties.put(LuisTelemetryConstants.SENTIMENT_LABEL_PROPERTY, sentiment.get("label").textValue());
+ }
+
+ if (sentiment.has("score")) {
+ properties.put(LuisTelemetryConstants.SENTIMENT_SCORE_PROPERTY, sentiment.get("score").textValue());
+ }
+ }
+
+ properties.put(LuisTelemetryConstants.ENTITIES_PROPERTY, recognizerResult.getEntities().toString());
+
+ // Use the LogPersonalInformation flag to toggle logging PII data, text is a
+ // common example
+ if (isLogPersonalInformation() && StringUtils.isNotBlank(turnContext.getActivity().getText())) {
+ properties.put(LuisTelemetryConstants.QUESTION_PROPERTY, turnContext.getActivity().getText());
+ }
+
+ // Additional Properties can override "stock" properties.
+ if (telemetryProperties == null) {
+ telemetryProperties = new HashMap<>();
+ }
+
+ properties.putAll(telemetryProperties);
+
+ return properties;
+ }
+
+ private T convertRecognizerResult(RecognizerResult recognizerResult, Class clazz) {
+ T result;
+ try {
+ result = clazz.newInstance();
+ result.convert(recognizerResult);
+ } catch (InstantiationException | IllegalAccessException e) {
+ throw new RuntimeException(
+ String.format("Exception thrown when converting " + "Recognizer Result to strongly typed: %s : %s",
+ clazz.getName(), e.getMessage()));
+ }
+ return result;
+ }
+
+ /**
+ * Returns a RecognizerResult object. This method will call the internal
+ * recognize implementation of the Luis Recognizer Options.
+ */
+ private CompletableFuture recognizeInternal(TurnContext turnContext,
+ LuisRecognizerOptions options, Map telemetryProperties,
+ Map telemetryMetrics) {
+ LuisRecognizerOptions predictionOptionsToRun = options == null ? luisRecognizerOptions : options;
+ return predictionOptionsToRun.recognizeInternal(turnContext).thenApply(recognizerResult -> {
+ onRecognizerResult(recognizerResult, turnContext, telemetryProperties, telemetryMetrics);
+ return recognizerResult;
+ });
+ }
+
+ /**
+ * Returns a RecognizerResult object. This method will call the internal
+ * recognize implementation of the Luis Recognizer Options.
+ */
+ private CompletableFuture recognizeInternal(DialogContext dialogContext, Activity activity,
+ LuisRecognizerOptions options, Map telemetryProperties,
+ Map telemetryMetrics) {
+ LuisRecognizerOptions predictionOptionsToRun = options == null ? luisRecognizerOptions : options;
+ return predictionOptionsToRun.recognizeInternal(dialogContext, activity).thenApply(recognizerResult -> {
+ onRecognizerResult(recognizerResult, dialogContext.getContext(), telemetryProperties, telemetryMetrics);
+ return recognizerResult;
+ });
+ }
+
+ private Map sortIntents(RecognizerResult recognizerResult) {
+ Map sortedIntents = new LinkedHashMap<>();
+ recognizerResult.getIntents().entrySet().stream()
+ .sorted(Map.Entry.comparingByValue(Comparator.comparingDouble(IntentScore::getScore).reversed()))
+ .forEachOrdered(x -> sortedIntents.put(x.getKey(), x.getValue()));
+ return sortedIntents;
+ }
+}
diff --git a/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/LuisRecognizerOptions.java b/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/LuisRecognizerOptions.java
new file mode 100644
index 000000000..d24aa0030
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/LuisRecognizerOptions.java
@@ -0,0 +1,142 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package com.microsoft.bot.ai.luis;
+
+import com.microsoft.bot.builder.BotTelemetryClient;
+import com.microsoft.bot.builder.NullBotTelemetryClient;
+import com.microsoft.bot.builder.RecognizerResult;
+import com.microsoft.bot.builder.TurnContext;
+import com.microsoft.bot.dialogs.DialogContext;
+import com.microsoft.bot.schema.Activity;
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * Abstract class to enforce the Strategy pattern consumed by the Luis
+ * Recognizer through the options selected.
+ *
+ */
+public abstract class LuisRecognizerOptions {
+
+ /**
+ * Initializes an instance of the LuisRecognizerOptions implementation.
+ *
+ * @param application An instance of LuisApplication".
+ */
+ protected LuisRecognizerOptions(LuisApplication application) {
+ if (application == null) {
+ throw new IllegalArgumentException("Luis Application may not be null");
+ }
+ this.application = application;
+ }
+
+ /**
+ * Luis Application instance.
+ */
+ private LuisApplication application;
+
+ /**
+ * Bot Telemetry Client instance.
+ */
+ private BotTelemetryClient telemetryClient = new NullBotTelemetryClient();
+
+ /**
+ * Controls if personal information should be sent as telemetry.
+ */
+ private boolean logPersonalInformation = false;
+
+ /**
+ * Controls if full results from the LUIS API should be returned with the
+ * recognizer result.
+ */
+ private boolean includeAPIResults = false;
+
+ /**
+ * Gets the Luis Application instance.
+ *
+ * @return The Luis Application instance used with this Options.
+ */
+ public LuisApplication getApplication() {
+ return application;
+ }
+
+ /**
+ * Gets the currently configured Bot Telemetry Client that logs the LuisResult
+ * event.
+ *
+ * @return The Bot Telemetry Client.
+ */
+ public BotTelemetryClient getTelemetryClient() {
+ return telemetryClient;
+ }
+
+ /**
+ * Sets the Bot Telemetry Client to log telemetry with.
+ *
+ * @param telemetryClient A Bot Telemetry Client instance
+ */
+ public void setTelemetryClient(BotTelemetryClient telemetryClient) {
+ this.telemetryClient = telemetryClient;
+ }
+
+ /**
+ * Indicates if personal information should be sent as telemetry.
+ *
+ * @return value boolean value to control personal information logging.
+ */
+ public boolean isLogPersonalInformation() {
+ return logPersonalInformation;
+ }
+
+ /**
+ * Indicates if personal information should be sent as telemetry.
+ *
+ * @param logPersonalInformation to set personal information logging preference.
+ */
+ public void setLogPersonalInformation(boolean logPersonalInformation) {
+ this.logPersonalInformation = logPersonalInformation;
+ }
+
+ /**
+ * Indicates if full results from the LUIS API should be returned with the
+ * recognizer result.
+ *
+ * @return boolean value showing preference on LUIS API full response added to
+ * recognizer result.
+ */
+ public boolean isIncludeAPIResults() {
+ return includeAPIResults;
+ }
+
+ /**
+ * Indicates if full results from the LUIS API should be returned with the
+ * recognizer result.
+ *
+ * @param includeAPIResults to set full Luis API response to be added to the
+ * recognizer result.
+ */
+ public void setIncludeAPIResults(boolean includeAPIResults) {
+ this.includeAPIResults = includeAPIResults;
+ }
+
+ /**
+ * Implementation of the Luis API http call and result processing. This is
+ * intended to follow a Strategy pattern and should only be consumed through the
+ * LuisRecognizer class.
+ *
+ * @param turnContext used to extract the text utterance to be sent to Luis.
+ * @return Recognizer Result populated by the Luis response.
+ */
+ abstract CompletableFuture recognizeInternal(TurnContext turnContext);
+
+ /**
+ * Implementation of the Luis API http call and result processing. This is
+ * intended to follow a Strategy pattern and should only be consumed through the
+ * LuisRecognizer class.
+ *
+ * @param context Dialog Context to extract turn context.
+ * @param activity to extract the text utterance to be sent to Luis.
+ * @return Recognizer Result populated by the Luis response.
+ */
+ abstract CompletableFuture recognizeInternal(DialogContext context, Activity activity);
+}
diff --git a/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/LuisRecognizerOptionsV3.java b/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/LuisRecognizerOptionsV3.java
new file mode 100644
index 000000000..4a6a56682
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/LuisRecognizerOptionsV3.java
@@ -0,0 +1,732 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package com.microsoft.bot.ai.luis;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.microsoft.bot.builder.IntentScore;
+import com.microsoft.bot.builder.RecognizerResult;
+import com.microsoft.bot.builder.TurnContext;
+import com.microsoft.bot.dialogs.DialogContext;
+import com.microsoft.bot.dialogs.Recognizer;
+import com.microsoft.bot.schema.Activity;
+import com.microsoft.bot.schema.ResourceResponse;
+
+import org.apache.commons.lang3.StringUtils;
+
+import okhttp3.HttpUrl;
+import okhttp3.MediaType;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.RequestBody;
+import okhttp3.Response;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * Luis Recognizer Options for V3 LUIS Runtime.
+ *
+ */
+public class LuisRecognizerOptionsV3 extends LuisRecognizerOptions {
+ private final HashSet dateSubtypes = new HashSet<>(
+ Arrays.asList("date", "daterange", "datetime", "datetimerange", "duration", "set", "time", "timerange"));
+
+ private final HashSet geographySubtypes = new HashSet<>(
+ Arrays.asList("poi", "city", "countryRegion", "continent", "state"));
+
+ private final String metadataKey = "$instance";
+
+ /**
+ * DatetimeV2 offset. The format for the datetimeReference is ISO 8601.
+ */
+ private String dateTimeReference = null;
+
+ /**
+ * Dynamic lists used to recognize entities for a particular query.
+ */
+ private List dynamicLists = null;
+
+ /**
+ * External entities recognized in query.
+ */
+ private List externalEntities = null;
+
+ /**
+ * External entity recognizer to recognize external entities to pass to LUIS.
+ */
+ private Recognizer externalEntityRecognizer = null;
+
+ /**
+ * Value indicating whether all intents come back or only the top one. True for
+ * returning all intents.
+ */
+ private boolean includeAllIntents = false;
+
+ /**
+ * Value indicating whether or not instance data should be included in response.
+ */
+ private boolean includeInstanceData = true;
+
+ /**
+ * Value indicating whether queries should be logged in LUIS. If queries should
+ * be logged in LUIS in order to help build better models through active
+ * learning
+ */
+ private boolean log = true;
+
+ /**
+ * Value indicating whether external entities should override other means of
+ * recognizing entities. True if external entities should be preferred to the
+ * results from LUIS models
+ */
+ private boolean preferExternalEntities = true;
+
+ /**
+ * The LUIS slot to use for the application. By default this uses the production
+ * slot. You can find other standard slots in LuisSlot. If you specify a
+ * Version, then a private version of the application is used instead of a slot.
+ */
+ private String slot = LuisSlot.PRODUCTION;
+
+ /**
+ * The specific version of the application to access. LUIS supports versions and
+ * this is the version to use instead of a slot. If this is specified, then the
+ * Slot is ignored.
+ */
+ private String version = null;
+
+ /**
+ * The HttpClient instance to use for http calls against the LUIS endpoint.
+ */
+ private OkHttpClient httpClient = new OkHttpClient();
+
+ /**
+ * The value type for a LUIS trace activity.
+ */
+ public static final String LUIS_TRACE_TYPE = "https://www.luis.ai/schemas/trace";
+
+ /**
+ * The context label for a LUIS trace activity.
+ */
+ public static final String LUIS_TRACE_LABEL = "LuisV3 Trace";
+
+ /**
+ * Gets External entity recognizer to recognize external entities to pass to
+ * LUIS.
+ *
+ * @return externalEntityRecognizer
+ */
+ public Recognizer getExternalEntityRecognizer() {
+ return externalEntityRecognizer;
+ }
+
+ /**
+ * Sets External entity recognizer to recognize external entities to pass to
+ * LUIS.
+ *
+ * @param externalEntityRecognizer External Recognizer instance.
+ */
+ public void setExternalEntityRecognizer(Recognizer externalEntityRecognizer) {
+ this.externalEntityRecognizer = externalEntityRecognizer;
+ }
+
+ /**
+ * Gets indicating whether all intents come back or only the top one. True for
+ * returning all intents.
+ *
+ * @return True for returning all intents.
+ */
+ public boolean isIncludeAllIntents() {
+ return includeAllIntents;
+ }
+
+ /**
+ * Sets indicating whether all intents come back or only the top one.
+ *
+ * @param includeAllIntents True for returning all intents.
+ */
+ public void setIncludeAllIntents(boolean includeAllIntents) {
+ this.includeAllIntents = includeAllIntents;
+ }
+
+ /**
+ * Gets value indicating whether or not instance data should be included in
+ * response.
+ *
+ * @return True if instance data should be included in response.
+ */
+ public boolean isIncludeInstanceData() {
+ return includeInstanceData;
+ }
+
+ /**
+ * Sets value indicating whether or not instance data should be included in
+ * response.
+ *
+ * @param includeInstanceData True if instance data should be included in
+ * response.
+ */
+ public void setIncludeInstanceData(boolean includeInstanceData) {
+ this.includeInstanceData = includeInstanceData;
+ }
+
+ /**
+ * Value indicating whether queries should be logged in LUIS. If queries should
+ * be logged in LUIS in order to help build better models through active
+ * learning
+ *
+ * @return True if queries should be logged in LUIS.
+ */
+ public boolean isLog() {
+ return log;
+ }
+
+ /**
+ * Value indicating whether queries should be logged in LUIS. If queries should
+ * be logged in LUIS in order to help build better models through active
+ * learning.
+ *
+ * @param log True if queries should be logged in LUIS.
+ */
+ public void setLog(boolean log) {
+ this.log = log;
+ }
+
+ /**
+ * Returns Dynamic lists used to recognize entities for a particular query.
+ *
+ * @return Dynamic lists used to recognize entities for a particular query
+ */
+ public List getDynamicLists() {
+ return dynamicLists;
+ }
+
+ /**
+ * Sets Dynamic lists used to recognize entities for a particular query.
+ *
+ * @param dynamicLists to recognize entities for a particular query.
+ */
+ public void setDynamicLists(List dynamicLists) {
+ this.dynamicLists = dynamicLists;
+ }
+
+ /**
+ * Gets External entities to be recognized in query.
+ *
+ * @return External entities to be recognized in query.
+ */
+ public List getExternalEntities() {
+ return externalEntities;
+ }
+
+ /**
+ * Sets External entities to be recognized in query.
+ *
+ * @param externalEntities External entities to be recognized in query.
+ */
+ public void setExternalEntities(List externalEntities) {
+ this.externalEntities = externalEntities;
+ }
+
+ /**
+ * Gets value indicating whether external entities should override other means
+ * of recognizing entities.
+ *
+ * @return True if external entities should be preferred to the results from
+ * LUIS models.
+ */
+ public boolean isPreferExternalEntities() {
+ return preferExternalEntities;
+ }
+
+ /**
+ * Sets value indicating whether external entities should override other means
+ * of recognizing entities.
+ *
+ * @param preferExternalEntities True if external entities should be preferred
+ * to the results from LUIS models.
+ */
+ public void setPreferExternalEntities(boolean preferExternalEntities) {
+ this.preferExternalEntities = preferExternalEntities;
+ }
+
+ /**
+ * Gets datetimeV2 offset. The format for the datetimeReference is ISO 8601.
+ *
+ * @return The format for the datetimeReference in ISO 8601.
+ */
+ public String getDateTimeReference() {
+ return dateTimeReference;
+ }
+
+ /**
+ * Sets datetimeV2 offset.
+ *
+ * @param dateTimeReference The format for the datetimeReference is ISO 8601.
+ */
+ public void setDateTimeReference(String dateTimeReference) {
+ this.dateTimeReference = dateTimeReference;
+ }
+
+ /**
+ * Gets the LUIS slot to use for the application. By default this uses the
+ * production slot. You can find other standard slots in LuisSlot. If you
+ * specify a Version, then a private version of the application is used instead
+ * of a slot.
+ *
+ * @return LuisSlot constant.
+ */
+ public String getSlot() {
+ return slot;
+ }
+
+ /**
+ * Sets the LUIS slot to use for the application. By default this uses the
+ * production slot. You can find other standard slots in LuisSlot. If you
+ * specify a Version, then a private version of the application is used instead
+ * of a slot.
+ *
+ * @param slot LuisSlot value to use.
+ */
+ public void setSlot(String slot) {
+ this.slot = slot;
+ }
+
+ /**
+ * Gets the specific version of the application to access. LUIS supports
+ * versions and this is the version to use instead of a slot. If this is
+ * specified, then the Slot is ignored.
+ *
+ * @return Luis application version to Query.
+ */
+ public String getVersion() {
+ return version;
+ }
+
+ /**
+ * Sets the specific version of the application to access. LUIS supports
+ * versions and this is the version to use instead of a slot.
+ *
+ * @param version Luis Application version. If this is specified, then the Slot
+ * is ignored.
+ */
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+ /**
+ * Gets whether the http client.
+ *
+ * @return OkHttpClient used to query the Luis Service.
+ */
+ public OkHttpClient getHttpClient() {
+ return httpClient;
+ }
+
+ /**
+ * Sets the http client.
+ *
+ * @param httpClient to use for Luis Service http calls.
+ */
+ public void setHttpClient(OkHttpClient httpClient) {
+ this.httpClient = httpClient;
+ }
+
+ /**
+ * Initializes a new instance of the LuisRecognizerOptionsV3.
+ *
+ * @param application Luis Application instance to query.
+ */
+ public LuisRecognizerOptionsV3(LuisApplication application) {
+ super(application);
+ }
+
+ /**
+ * Internal implementation of the http request to the LUIS service and parsing
+ * of the response to a Recognizer Result instance.
+ *
+ * @param dialogContext Context Object.
+ * @param activity Activity object to extract the utterance.
+ */
+ @Override
+ CompletableFuture recognizeInternal(DialogContext dialogContext, Activity activity) {
+ if (externalEntityRecognizer == null) {
+ return recognizeInternal(dialogContext.getContext(), activity.getText());
+ }
+
+ // call external entity recognizer
+ List originalExternalEntities = externalEntities;
+ return externalEntityRecognizer.recognize(dialogContext, activity).thenCompose(matches -> {
+ if (matches.getEntities() == null || matches.getEntities().toString().equals("{}")) {
+ return recognizeInternal(dialogContext.getContext(), activity.getText());
+ }
+
+ List recognizerExternalEntities = new ArrayList<>();
+ JsonNode entities = matches.getEntities();
+ JsonNode instance = entities.get("$instance");
+
+ if (instance == null) {
+ return recognizeInternal(dialogContext.getContext(), activity.getText());
+ }
+
+ Iterator> instanceEntitiesIterator = instance.fields();
+
+ while (instanceEntitiesIterator.hasNext()) {
+ Map.Entry property = instanceEntitiesIterator.next();
+
+ if (property.getKey().equals("text") || property.getKey().equals("$instance")) {
+ continue;
+ }
+
+ ArrayNode instances = (ArrayNode) instance.get(property.getKey());
+ ArrayNode values = (ArrayNode) property.getValue();
+
+ if (instances == null || values == null || instances.size() != values.size()) {
+ continue;
+ }
+
+ for (JsonNode childInstance : values) {
+ if (childInstance != null && childInstance.has("startIndex") && childInstance.has("endIndex")) {
+ int start = childInstance.get("startIndex").asInt();
+ int end = childInstance.get("endIndex").asInt();
+ recognizerExternalEntities
+ .add(new ExternalEntity(property.getKey(), start, end - start, property.getValue()));
+ }
+ }
+ recognizerExternalEntities
+ .addAll(originalExternalEntities == null ? new ArrayList<>() : originalExternalEntities);
+ externalEntities = recognizerExternalEntities;
+ }
+
+ return recognizeInternal(dialogContext.getContext(), activity.getText()).thenApply(recognizerResult -> {
+ externalEntities = originalExternalEntities;
+ return recognizerResult;
+ });
+ });
+ }
+
+ /**
+ * Internal implementation of the http request to the LUIS service and parsing
+ * of the response to a Recognizer Result instance.
+ *
+ * @param turnContext Context Object.
+ */
+ @Override
+ CompletableFuture recognizeInternal(TurnContext turnContext) {
+ return recognizeInternal(turnContext, turnContext.getActivity().getText());
+ }
+
+ private Request buildRequest(RequestBody body) {
+ StringBuilder path = new StringBuilder(getApplication().getEndpoint());
+ path.append(String.format("/luis/prediction/v3.0/apps/%s", getApplication().getApplicationId()));
+
+ if (version == null) {
+ path.append(String.format("/slots/%s/predict", slot));
+ } else {
+ path.append(String.format("/versions/%s/predict", version));
+ }
+
+ HttpUrl.Builder httpBuilder = HttpUrl.parse(path.toString()).newBuilder();
+
+ httpBuilder.addQueryParameter("verbose", Boolean.toString(includeInstanceData));
+ httpBuilder.addQueryParameter("log", Boolean.toString(log));
+ httpBuilder.addQueryParameter("show-all-intents", Boolean.toString(includeAllIntents));
+
+ Request.Builder requestBuilder = new Request.Builder().url(httpBuilder.build())
+ .addHeader("Ocp-Apim-Subscription-Key", getApplication().getEndpointKey()).post(body);
+ return requestBuilder.build();
+ }
+
+ private RequestBody buildRequestBody(String utterance) throws JsonProcessingException {
+
+ ObjectMapper mapper = new ObjectMapper().findAndRegisterModules();
+ ObjectNode content = JsonNodeFactory.instance.objectNode().put("query", utterance);
+ ObjectNode queryOptions = JsonNodeFactory.instance.objectNode().put("preferExternalEntities",
+ preferExternalEntities);
+
+ if (StringUtils.isNotBlank(dateTimeReference)) {
+ queryOptions.put("datetimeReference", dateTimeReference);
+ }
+
+ content.set("options", queryOptions);
+
+ if (dynamicLists != null) {
+ content.set("dynamicLists", mapper.valueToTree(dynamicLists));
+ }
+
+ if (externalEntities != null) {
+ for (ExternalEntity entity : externalEntities) {
+ entity.validate();
+ }
+ content.set("externalEntities", mapper.valueToTree(externalEntities));
+ }
+
+ String contentAsText = mapper.writeValueAsString(content);
+ return RequestBody.create(MediaType.parse("application/json; charset=utf-8"), contentAsText);
+ }
+
+ private CompletableFuture recognizeInternal(TurnContext turnContext, String utterance) {
+
+ RecognizerResult recognizerResult;
+ JsonNode luisResponse = null;
+ ObjectMapper mapper = new ObjectMapper().findAndRegisterModules();
+
+ if (utterance == null || utterance.isEmpty()) {
+ recognizerResult = new RecognizerResult();
+ recognizerResult.setText(utterance);
+ } else {
+ try {
+ Request request = buildRequest(buildRequestBody(utterance));
+ Response response = httpClient.newCall(request).execute();
+ luisResponse = mapper.readTree(response.body().string());
+ if (!response.isSuccessful()) {
+ throw new IOException("Unexpected code " + luisResponse.toString());
+ }
+
+ } catch (IOException e) {
+ CompletableFuture exceptionResult = new CompletableFuture<>();
+ exceptionResult.completeExceptionally(e);
+ return exceptionResult;
+ }
+
+ JsonNode prediction = luisResponse.get("prediction");
+ recognizerResult = new RecognizerResult();
+ recognizerResult.setText(utterance);
+ if (prediction.get("alteredQuery") != null) {
+ recognizerResult.setAlteredText(prediction.get("alteredQuery").asText());
+ }
+
+ recognizerResult.setIntents(getIntents(prediction));
+ recognizerResult.setEntities(getEntities(prediction));
+
+ addProperties(prediction, recognizerResult);
+ if (isIncludeAPIResults()) {
+ recognizerResult.getProperties().put("luisResult", luisResponse);
+ }
+
+ if (includeInstanceData && recognizerResult.getEntities().get(metadataKey) == null) {
+ ((ObjectNode) recognizerResult.getEntities()).putObject(metadataKey);
+ }
+ }
+
+ return sendTraceActivity(recognizerResult, luisResponse, turnContext).thenApply(v -> recognizerResult);
+
+ }
+
+ private Map getIntents(JsonNode prediction) {
+ Map intents = new LinkedHashMap<>();
+
+ JsonNode intentsObject = prediction.get("intents");
+ if (intentsObject == null) {
+ return intents;
+ }
+
+ for (Iterator> it = intentsObject.fields(); it.hasNext();) {
+ Map.Entry intent = it.next();
+ double score = intent.getValue().get("score").asDouble();
+ String intentName = intent.getKey().replace(".", "_").replace(" ", "_");
+ IntentScore intentScore = new IntentScore();
+ intentScore.setScore(score);
+ intents.put(intentName, intentScore);
+ }
+
+ return intents;
+ }
+
+ private String normalizeEntity(String entity) {
+ // Type::Role -> Role
+ String[] type = entity.split(":");
+ return type[type.length - 1].replace(".", "_").replace(" ", "_");
+ }
+
+ private JsonNode getEntities(JsonNode prediction) {
+ if (prediction.get("entities") == null) {
+ return JsonNodeFactory.instance.objectNode();
+ }
+
+ return mapEntitiesRecursive(prediction.get("entities"), false);
+ }
+
+ // Exact Port from C#
+ private JsonNode mapEntitiesRecursive(JsonNode source, boolean inInstance) {
+ JsonNode result = source;
+ if (!source.isArray() && source.isObject()) {
+ ObjectNode nobj = JsonNodeFactory.instance.objectNode();
+ // Fix datetime by reverting to simple timex
+ JsonNode obj = source;
+ JsonNode type = source.get("type");
+
+ if (!inInstance && type != null && dateSubtypes.contains(type.asText())) {
+ JsonNode timexs = obj.get("values");
+ ArrayNode arr = JsonNodeFactory.instance.arrayNode();
+ if (timexs != null) {
+ Set unique = new HashSet<>();
+
+ for (JsonNode elt : timexs) {
+ unique.add(elt.get("timex").textValue());
+ }
+
+ for (String timex : unique) {
+ arr.add(timex);
+ }
+
+ nobj.set("timex", arr);
+ }
+
+ nobj.set("type", type);
+ } else {
+ // Map or remove properties
+ Iterator> nodes = obj.fields();
+ while (nodes.hasNext()) {
+ Map.Entry property = (Map.Entry) nodes.next();
+ String name = normalizeEntity(property.getKey());
+ boolean isArray = property.getValue().isArray();
+ boolean isString = property.getValue().isTextual();
+ boolean isInt = property.getValue().isInt();
+ JsonNode val = mapEntitiesRecursive(property.getValue(), inInstance || name.equals(metadataKey));
+
+ if (name.equals("datetime") && isArray) {
+ nobj.set("datetimeV1", val);
+ } else if (name.equals("datetimeV2") && isArray) {
+ nobj.set("datetime", val);
+ } else if (inInstance) {
+ // Correct $instance issues
+ if (name.equals("length") && isInt) {
+ int value = property.getValue().intValue();
+ if (obj.get("startIndex") != null) {
+ value += obj.get("startIndex").intValue();
+ }
+ nobj.put("endIndex", value);
+ } else if (!((isInt && name.equals("modelTypeId")) || // NOPMD
+ (isString && name.equals("role"))) // NOPMD
+ ) { // NOPMD
+ nobj.set(name, val);
+ }
+ } else {
+ // Correct non-$instance values
+ if (name.equals("unit") && isString) {
+ nobj.set("units", val);
+ } else {
+ nobj.set(name, val);
+ }
+ }
+ }
+ }
+
+ result = nobj;
+ } else if (source.isArray()) {
+ JsonNode arr = source;
+ ArrayNode narr = JsonNodeFactory.instance.arrayNode();
+ for (JsonNode elt : arr) {
+ // Check if element is geographyV2
+ String isGeographyV2 = "";
+
+ Iterator> nodes = elt.fields();
+ while (nodes.hasNext()) {
+ Map.Entry props = (Map.Entry) nodes.next();
+
+ if (props == null) {
+ break;
+ }
+
+ if (props.getKey().contains("type") && geographySubtypes.contains(props.getValue().textValue())) {
+ isGeographyV2 = props.getValue().textValue();
+ break;
+ }
+ }
+
+ if (!inInstance && !isGeographyV2.isEmpty()) {
+ ObjectNode geoEntity = JsonNodeFactory.instance.objectNode();
+ nodes = elt.fields();
+ while (nodes.hasNext()) {
+ Map.Entry tokenProp = (Map.Entry) nodes.next();
+
+ if (tokenProp.getKey().contains("value")) {
+ geoEntity.set("location", tokenProp.getValue());
+ }
+ }
+
+ geoEntity.put("type", isGeographyV2);
+ narr.add(geoEntity);
+ } else {
+ narr.add(mapEntitiesRecursive(elt, inInstance));
+ }
+ }
+ result = narr;
+ }
+
+ return result;
+ }
+
+ private void addProperties(JsonNode prediction, RecognizerResult result) {
+ JsonNode sentiment = prediction.get("sentiment");
+ if (sentiment != null) {
+ ObjectNode sentimentNode = JsonNodeFactory.instance.objectNode();
+ sentimentNode.set("label", sentiment.get("label"));
+ sentimentNode.set("score", sentiment.get("score"));
+ result.getProperties().put("sentiment", sentimentNode);
+ }
+ }
+
+ private CompletableFuture sendTraceActivity(RecognizerResult recognizerResult,
+ JsonNode luisResponse, TurnContext turnContext) {
+ ObjectMapper mapper = new ObjectMapper().findAndRegisterModules();
+ try {
+ ObjectNode traceInfo = JsonNodeFactory.instance.objectNode();
+ traceInfo.put("recognizerResult",
+ mapper.writerWithDefaultPrettyPrinter().writeValueAsString(recognizerResult));
+ traceInfo.set("luisResult", luisResponse);
+ traceInfo.set("luisModel",
+ JsonNodeFactory.instance.objectNode().put("ModelId", getApplication().getApplicationId()));
+
+ ObjectNode luisOptions = JsonNodeFactory.instance.objectNode();
+ luisOptions.put("includeAllIntents", includeAllIntents);
+ luisOptions.put("includeInstanceData", includeInstanceData);
+ luisOptions.put("log", log);
+ luisOptions.put("preferExternalEntities", preferExternalEntities);
+ luisOptions.put("dateTimeReference", dateTimeReference);
+ luisOptions.put("slot", slot);
+ luisOptions.put("version", version);
+
+ if (externalEntities != null) {
+ ArrayNode externalEntitiesNode = JsonNodeFactory.instance.arrayNode();
+ for (ExternalEntity e : externalEntities) {
+ externalEntitiesNode.add(mapper.valueToTree(e));
+ }
+ luisOptions.put("externalEntities", externalEntitiesNode);
+ }
+
+ if (dynamicLists != null) {
+ ArrayNode dynamicListNode = JsonNodeFactory.instance.arrayNode();
+ for (DynamicList e : dynamicLists) {
+ dynamicListNode.add(mapper.valueToTree(e));
+ }
+ luisOptions.put("dynamicLists", dynamicListNode);
+ }
+
+ traceInfo.set("luisOptions", luisOptions);
+
+ return turnContext.sendActivity(
+ Activity.createTraceActivity("LuisRecognizer", LUIS_TRACE_TYPE, traceInfo, LUIS_TRACE_LABEL));
+
+ } catch (IOException e) {
+ CompletableFuture exceptionResult = new CompletableFuture<>();
+ exceptionResult.completeExceptionally(e);
+ return exceptionResult;
+ }
+ }
+}
diff --git a/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/LuisSlot.java b/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/LuisSlot.java
new file mode 100644
index 000000000..20d45a517
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/LuisSlot.java
@@ -0,0 +1,26 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package com.microsoft.bot.ai.luis;
+
+/**
+ * Utility class to set the Luis endpoint Slot.
+ *
+ */
+public final class LuisSlot {
+
+ // Not Called
+ private LuisSlot() {
+
+ }
+
+ /**
+ * Production slot on LUIS.
+ */
+ public static final String PRODUCTION = "production";
+
+ /**
+ * Staging slot on LUIS.
+ */
+ public static final String STAGING = "staging";
+}
diff --git a/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/LuisTelemetryConstants.java b/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/LuisTelemetryConstants.java
new file mode 100644
index 000000000..550b7bdcf
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/LuisTelemetryConstants.java
@@ -0,0 +1,79 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package com.microsoft.bot.ai.luis;
+
+/**
+ * Utility class to set the telemetry values for the Luis Recognizer.
+ *
+ */
+public final class LuisTelemetryConstants {
+
+ private LuisTelemetryConstants() {
+
+ }
+
+ /**
+ * The Key used when storing a LUIS Result in a custom event within telemetry.
+ */
+ public static final String LUIS_RESULT = "LuisResult"; // Event name
+
+ /**
+ * The Key used when storing a LUIS app ID in a custom event within telemetry.
+ */
+ public static final String APPLICATION_ID_PROPERTY = "applicationId";
+
+ /**
+ * The Key used when storing a LUIS intent in a custom event within telemetry.
+ */
+ public static final String INTENT_PROPERTY = "intent";
+
+ /**
+ * The Key used when storing a LUIS intent score in a custom event within
+ * telemetry.
+ */
+ public static final String INTENT_SCORE_PROPERTY = "intentScore";
+
+ /**
+ * The Key used when storing a LUIS intent in a custom event within telemetry.
+ */
+ public static final String INTENT_2_PROPERTY = "intent2";
+
+ /**
+ * The Key used when storing a LUIS intent score in a custom event within
+ * telemetry.
+ */
+ public static final String INTENT_SCORE_2_PROPERTY = "intentScore2";
+
+ /**
+ * The Key used when storing LUIS entities in a custom event within telemetry.
+ */
+ public static final String ENTITIES_PROPERTY = "entities";
+
+ /**
+ * The Key used when storing the LUIS query in a custom event within telemetry.
+ */
+ public static final String QUESTION_PROPERTY = "question";
+
+ /**
+ * The Key used when storing an Activity ID in a custom event within telemetry.
+ */
+ public static final String ACTIVITY_ID_PROPERTY = "activityId";
+
+ /**
+ * The Key used when storing a sentiment label in a custom event within
+ * telemetry.
+ */
+ public static final String SENTIMENT_LABEL_PROPERTY = "sentimentLabel";
+
+ /**
+ * The Key used when storing a LUIS sentiment score in a custom event within
+ * telemetry.
+ */
+ public static final String SENTIMENT_SCORE_PROPERTY = "sentimentScore";
+
+ /**
+ * The Key used when storing the FromId in a custom event within telemetry.
+ */
+ public static final String FROM_ID_PROPERTY = "fromId";
+}
diff --git a/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/TelemetryRecognizer.java b/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/TelemetryRecognizer.java
new file mode 100644
index 000000000..19eba4068
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/TelemetryRecognizer.java
@@ -0,0 +1,96 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package com.microsoft.bot.ai.luis;
+
+import com.microsoft.bot.builder.BotTelemetryClient;
+import com.microsoft.bot.builder.Recognizer;
+import com.microsoft.bot.builder.RecognizerConvert;
+import com.microsoft.bot.builder.RecognizerResult;
+import com.microsoft.bot.builder.TurnContext;
+
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * Telemetry Recognizer to enforce controls and properties on telemetry logged.
+ * Recognizer with Telemetry support.
+ *
+ */
+public abstract class TelemetryRecognizer implements Recognizer {
+
+ private boolean logPersonalInformation;
+
+ private BotTelemetryClient telemetryClient;
+
+ /**
+ * Indicates if personal information should be sent as telemetry.
+ *
+ * @return value boolean value to control personal information logging.
+ */
+ public boolean isLogPersonalInformation() {
+ return logPersonalInformation;
+ }
+
+ /**
+ * Indicates if personal information should be sent as telemetry.
+ *
+ * @param logPersonalInformation to set personal information logging preference.
+ */
+ protected void setLogPersonalInformation(boolean logPersonalInformation) {
+ this.logPersonalInformation = logPersonalInformation;
+ }
+
+ /**
+ * Gets the currently configured Bot Telemetry Client that logs the LuisResult
+ * event.
+ *
+ * @return The Bot Telemetry Client.
+ */
+ protected BotTelemetryClient getTelemetryClient() {
+ return telemetryClient;
+ }
+
+ /**
+ * Sets the currently configured Bot Telemetry Client that logs the LuisResult
+ * event.
+ *
+ * @param telemetryClient Bot Telemetry Client.
+ */
+ public void setTelemetryClient(BotTelemetryClient telemetryClient) {
+ this.telemetryClient = telemetryClient;
+ }
+
+ /**
+ * Return results of the analysis (Suggested actions and intents).
+ *
+ * @param turnContext Context object containing information for a single
+ * turn of conversation with a user.
+ * @param telemetryProperties Additional properties to be logged to telemetry
+ * with the LuisResult event.
+ * @param telemetryMetrics Additional metrics to be logged to telemetry with
+ * the LuisResult event.
+ * @return The LUIS results of the analysis of the current message text in the
+ * current turn's context activity.
+ */
+ abstract CompletableFuture recognize(TurnContext turnContext,
+ Map telemetryProperties, Map telemetryMetrics);
+
+ /**
+ * Return results of the analysis (Suggested actions and intents).
+ *
+ * @param turnContext Context object containing information for a single
+ * turn of conversation with a user.
+ * @param telemetryProperties Additional properties to be logged to telemetry
+ * with the LuisResult event.
+ * @param telemetryMetrics Additional metrics to be logged to telemetry with
+ * the LuisResult event.
+ * @param Result type.
+ * @param c The recognition result type class
+ * @return The LUIS results of the analysis of the current message text in the
+ * current turn's context activity.
+ */
+ abstract CompletableFuture recognize(TurnContext turnContext,
+ Map telemetryProperties, Map telemetryMetrics, Class c);
+
+}
diff --git a/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/package-info.java b/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/package-info.java
new file mode 100644
index 000000000..6927f945d
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/main/java/com/microsoft/bot/ai/luis/package-info.java
@@ -0,0 +1,9 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See License.txt in the project root for
+// license information.
+
+/**
+ * This package contains the classes for com.microsoft.bot.ai.luis.
+ */
+@Deprecated
+package com.microsoft.bot.ai.luis;
diff --git a/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/LuisApplicationTests.java b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/LuisApplicationTests.java
new file mode 100644
index 000000000..4522a3c92
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/LuisApplicationTests.java
@@ -0,0 +1,99 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package com.microsoft.bot.ai.luis;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class LuisApplicationTests {
+ String validUUID = "b31aeaf3-3511-495b-a07f-571fc873214b";
+ String invalidUUID = "0000";
+ String validEndpoint = "https://www.test.com";
+ String invalidEndpoint = "www.test.com";
+
+ @Test
+ public void invalidSubscriptionKey() {
+
+ Exception exception = Assert.assertThrows(IllegalArgumentException.class, () -> {
+ LuisApplication lA = new LuisApplication(
+ validUUID,
+ invalidUUID,
+ validEndpoint);
+ });
+
+ String expectedMessage = String.format("%s is not a valid LUIS subscription key.", invalidUUID);
+ String actualMessage = exception.getMessage();
+
+ Assert.assertTrue(actualMessage.contains(expectedMessage));
+ }
+
+ @Test
+ public void invalidApplicationId () {
+
+ Exception exception = Assert.assertThrows(IllegalArgumentException.class, () -> {
+ LuisApplication lA = new LuisApplication(
+ invalidUUID,
+ validUUID,
+ validEndpoint);
+ });
+
+ String expectedMessage = String.format("%s is not a valid LUIS application id.", invalidUUID);
+ String actualMessage = exception.getMessage();
+
+ Assert.assertTrue(actualMessage.contains(expectedMessage));
+ }
+
+ @Test
+ public void invalidEndpoint() {
+
+ Exception exception = Assert.assertThrows(IllegalArgumentException.class, () -> {
+ LuisApplication lA = new LuisApplication(
+ validUUID,
+ validUUID,
+ invalidEndpoint);
+ });
+
+ String expectedMessage = String.format("%s is not a valid LUIS endpoint.", invalidEndpoint);
+ String actualMessage = exception.getMessage();
+
+ Assert.assertTrue(actualMessage.contains(expectedMessage));
+ }
+
+ @Test
+ public void createsNewLuisApplication() {
+
+ LuisApplication lA = new LuisApplication(
+ validUUID,
+ validUUID,
+ validEndpoint
+ );
+
+ Assert.assertTrue(lA.getApplicationId().equals(validUUID));
+ Assert.assertTrue(lA.getEndpointKey().equals(validUUID));
+ Assert.assertTrue(lA.getEndpoint().equals(validEndpoint));
+ }
+
+ @Test
+ public void createsNewLuisApplicationFromURL() {
+ String url = "https://westus.api.cognitive.microsoft.com/luis/prediction/v3.0/apps/b31aeaf3-3511-495b-a07f-571fc873214b/slots/production/predict?verbose=true&timezoneOffset=-360&subscription-key=048ec46dc58e495482b0c447cfdbd291";
+ LuisApplication lA = new LuisApplication(url);
+
+ Assert.assertTrue(lA.getApplicationId().equals("b31aeaf3-3511-495b-a07f-571fc873214b"));
+ Assert.assertTrue(lA.getEndpointKey().equals("048ec46dc58e495482b0c447cfdbd291"));
+ Assert.assertTrue(lA.getEndpoint().equals("https://westus.api.cognitive.microsoft.com"));
+ }
+
+ @Test
+ public void listApplicationFromLuisEndpointBadArguments() {
+ Assert.assertThrows(IllegalArgumentException.class, () -> {
+ LuisApplication lA = new LuisApplication("this.is.not.a.uri");
+ });
+ Assert.assertThrows(IllegalArgumentException.class, () -> {
+ LuisApplication lA = new LuisApplication("https://westus.api.cognitive.microsoft.com/luis/v3.0/apps/b31aeaf3-3511-495b-a07f-571fc873214b?verbose=true&timezoneOffset=-360&q=");
+ });
+ Assert.assertThrows(IllegalArgumentException.class, () -> {
+ LuisApplication lA = new LuisApplication("https://westus.api.cognitive.microsoft.com?verbose=true&timezoneOffset=-360&subscription-key=048ec46dc58e495482b0c447cfdbd291&q=");
+ });
+ }
+}
diff --git a/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/LuisRecognizerOptionsV3Tests.java b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/LuisRecognizerOptionsV3Tests.java
new file mode 100644
index 000000000..f60e0c562
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/LuisRecognizerOptionsV3Tests.java
@@ -0,0 +1,331 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package com.microsoft.bot.ai.luis;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectReader;
+import com.microsoft.bot.builder.BotAdapter;
+import com.microsoft.bot.builder.RecognizerResult;
+import com.microsoft.bot.builder.TurnContext;
+import com.microsoft.bot.builder.TurnContextImpl;
+import com.microsoft.bot.dialogs.DialogContext;
+import com.microsoft.bot.dialogs.Recognizer;
+import com.microsoft.bot.schema.Activity;
+import com.microsoft.bot.schema.ActivityTypes;
+import com.microsoft.bot.schema.ConversationReference;
+import com.microsoft.bot.schema.ResourceResponse;
+import okhttp3.HttpUrl;
+import okhttp3.mockwebserver.MockResponse;
+import okhttp3.mockwebserver.MockWebServer;
+import okhttp3.mockwebserver.RecordedRequest;
+import org.apache.commons.io.FileUtils;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Paths;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.*;
+
+
+@RunWith(MockitoJUnitRunner.class)
+public class LuisRecognizerOptionsV3Tests {
+
+ @Mock
+ DialogContext dC;
+
+ @Mock
+ Recognizer recognizer;
+
+ @Mock
+ TurnContext turnContext;
+
+ // Set this values to test against the service
+ String applicationId = "b31aeaf3-3511-495b-a07f-571fc873214b";
+ String subscriptionKey = "b31aeaf3-3511-495b-a07f-571fc873214b";
+ boolean mockLuisResponse = true;
+
+ @Test
+ public void shouldParseLuisResponsesCorrectly_TurnContextPassed() {
+ String[] files = {
+ "Composite1.json",
+ "Composite2.json",
+ "Composite3.json",
+ "DateTimeReference.json",
+ "DynamicListsAndList.json",
+ "ExternalEntitiesAndBuiltin.json",
+ "ExternalEntitiesAndComposite.json",
+ "ExternalEntitiesAndList.json",
+ "ExternalEntitiesAndRegex.json",
+ "ExternalEntitiesAndSimple.json",
+ "ExternalEntitiesAndSimpleOverride.json",
+ "GeoPeopleOrdinal.json",
+ "Minimal.json",
+// TODO: This is disabled until the bug requiring instance data for geo is fixed.
+// "MinimalWithGeo.json",
+ "NoEntitiesInstanceTrue.json",
+ "Patterns.json",
+ "Prebuilt.json",
+ "roles.json",
+ "TraceActivity.json",
+ "Typed.json",
+ "TypedPrebuilt.json"
+ };
+
+ for (String file : files) {
+ shouldParseLuisResponsesCorrectly_TurnContextPassed(file);
+ reset(turnContext);
+ }
+ }
+
+ private void shouldParseLuisResponsesCorrectly_TurnContextPassed(String fileName) {
+ RecognizerResult result = null, expected = null;
+ MockWebServer mockWebServer = new MockWebServer();
+
+ try {
+ // Get Oracle file
+ String content = readFileContent("/src/test/java/com/microsoft/bot/ai/luis/testdata/" + fileName);
+
+ //Extract V3 response
+ ObjectMapper mapper = new ObjectMapper().findAndRegisterModules();
+ JsonNode testData = mapper.readTree(content);
+ JsonNode v3SettingsAndResponse = testData.get("v3");
+ JsonNode v3Response = v3SettingsAndResponse.get("response");
+
+ //Extract V3 Test Settings
+ JsonNode testSettings = v3SettingsAndResponse.get("options");
+
+ // Set mock response in MockWebServer
+ StringBuilder pathToMock = new StringBuilder("/luis/prediction/v3.0/apps/");
+ String url = buildUrl(pathToMock, testSettings);
+ String endpoint = "";
+ if (this.mockLuisResponse) {
+ endpoint = String.format(
+ "http://localhost:%s",
+ initializeMockServer(
+ mockWebServer,
+ v3Response,
+ url).port());
+ }
+
+ // Set LuisRecognizerOptions data
+ LuisRecognizerOptionsV3 v3 = buildTestRecognizer(endpoint, testSettings);
+
+ // Run test
+ Activity activity = new Activity(ActivityTypes.MESSAGE);
+ activity.setText(testData.get("text").asText());
+ activity.setChannelId("EmptyContext");
+ doReturn(activity)
+ .when(turnContext)
+ .getActivity();
+
+ doReturn(CompletableFuture.completedFuture(new ResourceResponse()))
+ .when(turnContext)
+ .sendActivity(any(Activity.class));
+
+ result = v3.recognizeInternal(turnContext).get();
+
+ // Build expected result
+ expected = mapper.readValue(content, RecognizerResult.class);
+ Map properties = expected.getProperties();
+ properties.remove("v2");
+ properties.remove("v3");
+
+ assertEquals(mapper.writeValueAsString(expected), mapper.writeValueAsString(result));
+
+ RecordedRequest request = mockWebServer.takeRequest();
+ assertEquals(String.format("POST %s HTTP/1.1", pathToMock.toString()), request.getRequestLine());
+ assertEquals(pathToMock.toString(), request.getPath());
+
+ verify(turnContext, times(1)).sendActivity(any (Activity.class));
+
+ } catch (InterruptedException | ExecutionException | IOException e) {
+ e.printStackTrace();
+ assertFalse(true);
+ } finally {
+ try {
+ mockWebServer.shutdown();
+ } catch (IOException e) {
+ // Empty error
+ }
+ }
+ }
+
+ @Test
+ public void shouldBuildExternalEntities_DialogContextPassed_ExternalRecognizer() {
+ MockWebServer mockWebServer = new MockWebServer();
+
+ try {
+ // Get Oracle file
+ String content = readFileContent("/src/test/java/com/microsoft/bot/ai/luis/testdata/ExternalRecognizer.json");
+
+ //Extract V3 response
+ ObjectMapper mapper = new ObjectMapper().findAndRegisterModules();
+ JsonNode testData = mapper.readTree(content);
+ JsonNode v3SettingsAndResponse = testData.get("v3");
+ JsonNode v3Response = v3SettingsAndResponse.get("response");
+
+ //Extract V3 Test Settings
+ JsonNode testSettings = v3SettingsAndResponse.get("options");
+
+ // Set mock response in MockWebServer
+ StringBuilder pathToMock = new StringBuilder("/luis/prediction/v3.0/apps/");
+ String url = buildUrl(pathToMock, testSettings);
+ String endpoint = String.format(
+ "http://localhost:%s",
+ initializeMockServer(
+ mockWebServer,
+ v3Response,
+ url).port());
+
+ // Set LuisRecognizerOptions data
+ LuisRecognizerOptionsV3 v3 = buildTestRecognizer(endpoint, testSettings);
+ v3.setExternalEntityRecognizer(recognizer);
+
+ Activity activity = new Activity(ActivityTypes.MESSAGE);
+ activity.setText(testData.get("text").asText());
+ activity.setChannelId("EmptyContext");
+
+ doReturn(CompletableFuture.completedFuture(new ResourceResponse()))
+ .when(turnContext)
+ .sendActivity(any(Activity.class));
+
+ when(dC.getContext()).thenReturn(turnContext);
+
+ doReturn(CompletableFuture.supplyAsync(() -> {
+ RecognizerResult recognizerResult = new RecognizerResult();
+ recognizerResult.setEntities(testSettings.get("ExternalRecognizerResult"));
+ return recognizerResult;
+ }))
+ .when(recognizer)
+ .recognize(any(DialogContext.class), any(Activity.class));
+
+ v3.recognizeInternal(dC, activity).get();
+
+ RecordedRequest request = mockWebServer.takeRequest();
+ String resultBody = request.getBody().readUtf8();
+ assertEquals("{\"query\":\"deliver 35 WA to repent harelquin\"," +
+ "\"options\":{\"preferExternalEntities\":true}," +
+ "\"externalEntities\":[{\"entityName\":\"Address\",\"startIndex\":17,\"entityLength\":16," +
+ "\"resolution\":[{\"endIndex\":33,\"modelType\":\"Composite Entity Extractor\"," +
+ "\"resolution\":{\"number\":[3],\"State\":[\"France\"]}," +
+ "\"startIndex\":17,\"text\":\"repent harelquin\",\"type\":\"Address\"}]}]}",
+ resultBody);
+
+ } catch (InterruptedException | ExecutionException | IOException e) {
+ e.printStackTrace();
+ assertFalse(true);
+ } finally {
+ try {
+ mockWebServer.shutdown();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public static TurnContext createContext(String message) {
+
+ Activity activity = new Activity(ActivityTypes.MESSAGE);
+ activity.setText(message);
+ activity.setChannelId("EmptyContext");
+
+ return new TurnContextImpl(new NotImplementedAdapter(), activity);
+ }
+
+ private static class NotImplementedAdapter extends BotAdapter {
+ @Override
+ public CompletableFuture sendActivities(
+ TurnContext context,
+ List activities
+ ) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture updateActivity(
+ TurnContext context,
+ Activity activity
+ ) {
+ throw new RuntimeException();
+ }
+
+ @Override
+ public CompletableFuture deleteActivity(
+ TurnContext context,
+ ConversationReference reference
+ ) {
+ throw new RuntimeException();
+ }
+ }
+
+ private String readFileContent (String pathToFile) throws IOException {
+ String path = Paths.get("").toAbsolutePath().toString();
+ File file = new File(path + pathToFile);
+ return FileUtils.readFileToString(file, "utf-8");
+ }
+
+ private String buildUrl(StringBuilder pathToMock, JsonNode testSettings) {
+ pathToMock.append(this.applicationId);
+
+ if (testSettings.get("Version") != null ) {
+ pathToMock.append(String.format("/versions/%s/predict", testSettings.get("Version").asText()));
+ } else {
+ pathToMock.append(String.format("/slots/%s/predict", testSettings.get("Slot").asText()));
+ }
+ pathToMock.append(
+ String.format(
+ "?verbose=%s&log=%s&show-all-intents=%s",
+ testSettings.get("IncludeInstanceData").asText(),
+ testSettings.get("Log").asText(),
+ testSettings.get("IncludeAllIntents").asText()
+ )
+ );
+
+ return pathToMock.toString();
+ }
+
+ private HttpUrl initializeMockServer(MockWebServer mockWebServer, JsonNode v3Response, String url) throws IOException {
+ ObjectMapper mapper = new ObjectMapper().findAndRegisterModules();
+ String mockResponse = mapper.writeValueAsString(v3Response);
+ mockWebServer.enqueue(new MockResponse()
+ .addHeader("Content-Type", "application/json; charset=utf-8")
+ .setBody(mockResponse));
+
+ mockWebServer.start();
+
+ return mockWebServer.url(url);
+ }
+
+ private LuisRecognizerOptionsV3 buildTestRecognizer (String endpoint, JsonNode testSettings) throws IOException {
+ ObjectMapper mapper = new ObjectMapper().findAndRegisterModules();
+ ObjectReader readerDynamicList = mapper.readerFor(new TypeReference>() {});
+ ObjectReader readerExternalentities = mapper.readerFor(new TypeReference>() {});
+ LuisRecognizerOptionsV3 recognizer = new LuisRecognizerOptionsV3(
+ new LuisApplication(
+ this.applicationId,
+ this.subscriptionKey,
+ endpoint));
+ recognizer.setIncludeInstanceData(testSettings.get("IncludeInstanceData").asBoolean());
+ recognizer.setIncludeAllIntents(testSettings.get("IncludeAllIntents").asBoolean());
+ recognizer.setVersion(testSettings.get("Version") == null ? null : testSettings.get("Version").asText());
+ recognizer.setDynamicLists(testSettings.get("DynamicLists") == null ? null : readerDynamicList.readValue(testSettings.get("DynamicLists")));
+ recognizer.setExternalEntities(testSettings.get("ExternalEntities") == null ? null : readerExternalentities.readValue(testSettings.get("ExternalEntities")));
+ recognizer.setDateTimeReference(testSettings.get("DateTimeReference") == null ? null : testSettings.get("DateTimeReference").asText());
+ return recognizer;
+ }
+
+}
diff --git a/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/LuisRecognizerTests.java b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/LuisRecognizerTests.java
new file mode 100644
index 000000000..884247522
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/LuisRecognizerTests.java
@@ -0,0 +1,416 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package com.microsoft.bot.ai.luis;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.microsoft.bot.ai.luis.testdata.TestRecognizerResultConvert;
+import com.microsoft.bot.builder.BotTelemetryClient;
+import com.microsoft.bot.builder.IntentScore;
+import com.microsoft.bot.builder.RecognizerResult;
+import com.microsoft.bot.builder.TurnContext;
+import com.microsoft.bot.dialogs.DialogContext;
+import com.microsoft.bot.schema.Activity;
+import com.microsoft.bot.schema.ActivityTypes;
+import com.microsoft.bot.schema.ChannelAccount;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.*;
+
+@RunWith(MockitoJUnitRunner.class)
+public class LuisRecognizerTests {
+
+ @Mock
+ LuisRecognizerOptionsV3 options;
+
+ @Mock
+ BotTelemetryClient telemetryClient;
+
+ @Mock
+ TurnContext turnContext;
+
+ @Mock
+ DialogContext dialogContext;
+
+ @Mock
+ LuisApplication luisApplication;
+
+ private RecognizerResult getMockedResult() {
+ RecognizerResult recognizerResult = new RecognizerResult();
+ HashMap intents = new HashMap();
+ IntentScore testScore = new IntentScore();
+ testScore.setScore(0.2);
+ IntentScore greetingScore = new IntentScore();
+ greetingScore.setScore(0.4);
+ intents.put("Test", testScore);
+ intents.put("Greeting", greetingScore);
+ recognizerResult.setIntents(intents);
+ recognizerResult.setEntities(JsonNodeFactory.instance.objectNode());
+ recognizerResult.setProperties(
+ "sentiment",
+ JsonNodeFactory.instance.objectNode()
+ .put(
+ "label",
+ "neutral"));
+ return recognizerResult;
+ };
+
+ @Test
+ public void topIntentReturnsTopIntent() {
+ String greetingIntent = LuisRecognizer
+ .topIntent(getMockedResult());
+ assertEquals(greetingIntent, "Greeting");
+ }
+
+ @Test
+ public void topIntentReturnsDefaultIfMinScoreIsHigher() {
+ String defaultIntent = LuisRecognizer
+ .topIntent(getMockedResult(), 0.5);
+ assertEquals(defaultIntent, "None");
+ }
+
+ @Test
+ public void topIntentReturnsDefaultIfProvided() {
+ String defaultIntent = LuisRecognizer
+ .topIntent(getMockedResult(), "Test2", 0.5);
+ assertEquals(defaultIntent, "Test2");
+ }
+
+ @Test
+ public void topIntentThrowsIllegalArgumentIfResultIsNull() {
+ Exception exception = Assert.assertThrows(IllegalArgumentException.class, () -> {
+ LuisRecognizer.topIntent(null);
+ });
+
+ String expectedMessage = "RecognizerResult";
+ String actualMessage = exception.getMessage();
+
+ Assert.assertTrue(actualMessage.contains(expectedMessage));
+ }
+
+ @Test
+ public void TopIntentReturnsTopIntentIfScoreEqualsMinScore() {
+ String defaultIntent = LuisRecognizer.topIntent(getMockedResult(), 0.4);
+ assertEquals(defaultIntent, "Greeting");
+ }
+
+ @Test
+ public void throwExceptionOnNullOptions() {
+ Exception exception = Assert.assertThrows(IllegalArgumentException.class, () -> {
+ LuisRecognizer lR = new LuisRecognizer(null);
+ });
+
+ String actualMessage = exception.getMessage();
+ Assert.assertTrue(actualMessage.contains("Recognizer Options cannot be null"));
+ }
+
+ @Test
+ public void recognizerResult() {
+ setMockObjectsForTelemetry();
+ LuisRecognizer recognizer = new LuisRecognizer(options);
+ RecognizerResult expected = new RecognizerResult();
+ expected.setText("Random Message");
+ HashMap intents = new HashMap();
+ IntentScore testScore = new IntentScore();
+ testScore.setScore(0.2);
+ IntentScore greetingScore = new IntentScore();
+ greetingScore.setScore(0.4);
+ intents.put("Test", testScore);
+ intents.put("Greeting", greetingScore);
+ expected.setIntents(intents);
+ expected.setEntities(JsonNodeFactory.instance.objectNode());
+ expected.setProperties(
+ "sentiment",
+ JsonNodeFactory.instance.objectNode()
+ .put(
+ "label",
+ "neutral"));
+ RecognizerResult actual = null;
+ try {
+ actual = recognizer.recognize(turnContext).get();
+ ObjectMapper mapper = new ObjectMapper().findAndRegisterModules();
+ assertEquals(mapper.writeValueAsString(expected), mapper.writeValueAsString(actual));
+ } catch (InterruptedException | ExecutionException | JsonProcessingException e) {
+ e.printStackTrace();
+ Assert.assertTrue(false);
+ }
+ }
+
+ @Test
+ public void recognizerResult_nullTelemetryClient() {
+ Activity activity = new Activity(ActivityTypes.MESSAGE);
+ activity.setText("Random Message");
+ activity.setChannelId("EmptyContext");
+ ChannelAccount channelAccount = new ChannelAccount();
+ channelAccount.setId("Activity-from-ID");
+ activity.setFrom(channelAccount);
+ when(turnContext.getActivity())
+ .thenReturn(activity);
+
+ when(luisApplication.getApplicationId())
+ .thenReturn("b31aeaf3-3511-495b-a07f-571fc873214b");
+
+ when(options.getApplication())
+ .thenReturn(luisApplication);
+ RecognizerResult mockedResult = getMockedResult();
+ mockedResult.setText("Random Message");
+ doReturn(CompletableFuture.supplyAsync(() -> mockedResult))
+ .when(options)
+ .recognizeInternal(
+ any(TurnContext.class));
+
+ LuisRecognizer recognizer = new LuisRecognizer(options);
+ RecognizerResult expected = new RecognizerResult();
+ expected.setText("Random Message");
+ HashMap intents = new HashMap();
+ IntentScore testScore = new IntentScore();
+ testScore.setScore(0.2);
+ IntentScore greetingScore = new IntentScore();
+ greetingScore.setScore(0.4);
+ intents.put("Test", testScore);
+ intents.put("Greeting", greetingScore);
+ expected.setIntents(intents);
+ expected.setEntities(JsonNodeFactory.instance.objectNode());
+ expected.setProperties(
+ "sentiment",
+ JsonNodeFactory.instance.objectNode()
+ .put(
+ "label",
+ "neutral"));
+ RecognizerResult actual = null;
+ try {
+ actual = recognizer.recognize(turnContext).get();
+ ObjectMapper mapper = new ObjectMapper().findAndRegisterModules();
+ assertEquals(mapper.writeValueAsString(expected), mapper.writeValueAsString(actual));
+ } catch (InterruptedException | ExecutionException | JsonProcessingException e) {
+ e.printStackTrace();
+ Assert.assertTrue(false);
+ }
+ }
+
+ @Test
+ public void recognizerResultDialogContext() {
+ RecognizerResult expected = new RecognizerResult();
+ expected.setText("Random Message");
+ HashMap intents = new HashMap();
+ IntentScore testScore = new IntentScore();
+ testScore.setScore(0.2);
+ IntentScore greetingScore = new IntentScore();
+ greetingScore.setScore(0.4);
+ intents.put("Test", testScore);
+ intents.put("Greeting", greetingScore);
+ expected.setIntents(intents);
+ expected.setEntities(JsonNodeFactory.instance.objectNode());
+ expected.setProperties(
+ "sentiment",
+ JsonNodeFactory.instance.objectNode()
+ .put(
+ "label",
+ "neutral"));
+ RecognizerResult actual = null;
+ Activity activity = new Activity(ActivityTypes.MESSAGE);
+ activity.setText("Random Message");
+ activity.setChannelId("EmptyContext");
+ ChannelAccount channelAccount = new ChannelAccount();
+ channelAccount.setId("Activity-from-ID");
+ activity.setFrom(channelAccount);
+ when(turnContext.getActivity())
+ .thenReturn(activity);
+ when(luisApplication.getApplicationId())
+ .thenReturn("b31aeaf3-3511-495b-a07f-571fc873214b");
+
+ when(options.getTelemetryClient()).thenReturn(telemetryClient);
+
+ when(options.getApplication())
+ .thenReturn(luisApplication);
+ RecognizerResult mockedResult = getMockedResult();
+ mockedResult.setText("Random Message");
+ when(dialogContext.getContext())
+ .thenReturn(turnContext);
+
+ doReturn(CompletableFuture.supplyAsync(() -> mockedResult))
+ .when(options)
+ .recognizeInternal(
+ any(DialogContext.class), any(Activity.class));
+ LuisRecognizer recognizer = new LuisRecognizer(options);
+ try {
+ actual = recognizer.recognize(dialogContext, turnContext.getActivity()).get();
+ ObjectMapper mapper = new ObjectMapper().findAndRegisterModules();
+ assertEquals(mapper.writeValueAsString(expected), mapper.writeValueAsString(actual));
+ } catch (InterruptedException | ExecutionException | JsonProcessingException e) {
+ e.printStackTrace();
+ Assert.assertTrue(false);
+ }
+ }
+
+ @Test
+ public void recognizerResultConverted() {
+
+ setMockObjectsForTelemetry();
+ LuisRecognizer recognizer = new LuisRecognizer(options);
+ TestRecognizerResultConvert actual = null;
+ try {
+ actual = recognizer.recognize(turnContext, TestRecognizerResultConvert.class).get();
+ } catch (InterruptedException | ExecutionException e) {
+ e.printStackTrace();
+ }
+
+ TestRecognizerResultConvert expected = new TestRecognizerResultConvert();
+ expected.recognizerResultText = "Random Message";
+
+ assertEquals(expected.recognizerResultText, actual.recognizerResultText);
+ }
+
+ @Test
+ public void telemetryPropertiesAreFilledOnRecognizer() {
+
+ setMockObjectsForTelemetry();
+ LuisRecognizer recognizer = new LuisRecognizer(options);
+
+ try {
+ recognizer.recognize(turnContext).get();
+ } catch (InterruptedException | ExecutionException e) {
+ e.printStackTrace();
+ }
+ Map expectedProperties = new HashMap();
+ expectedProperties.put("intentScore", "0.4");
+ expectedProperties.put("intent2", "Test");
+ expectedProperties.put("entities", "{}");
+ expectedProperties.put("intentScore2", "0.2");
+ expectedProperties.put("applicationId", "b31aeaf3-3511-495b-a07f-571fc873214b");
+ expectedProperties.put("intent", "Greeting");
+ expectedProperties.put("fromId", "Activity-from-ID");
+ expectedProperties.put("sentimentLabel", "neutral");
+
+ verify(telemetryClient, atLeastOnce()).trackEvent("LuisResult", expectedProperties, null);
+ }
+
+ @Test
+ public void telemetry_PiiLogged() {
+
+ setMockObjectsForTelemetry();
+ when(options.isLogPersonalInformation()).thenReturn(true);
+
+ LuisRecognizer recognizer = new LuisRecognizer(options);
+
+ try {
+ recognizer.recognize(turnContext).get();
+ } catch (InterruptedException | ExecutionException e) {
+ e.printStackTrace();
+ }
+ Map expectedProperties = new HashMap();
+ expectedProperties.put("intentScore", "0.4");
+ expectedProperties.put("intent2", "Test");
+ expectedProperties.put("entities", "{}");
+ expectedProperties.put("intentScore2", "0.2");
+ expectedProperties.put("applicationId", "b31aeaf3-3511-495b-a07f-571fc873214b");
+ expectedProperties.put("intent", "Greeting");
+ expectedProperties.put("fromId", "Activity-from-ID");
+ expectedProperties.put("sentimentLabel", "neutral");
+ expectedProperties.put("question", "Random Message");
+
+ verify(telemetryClient, atLeastOnce()).trackEvent("LuisResult", expectedProperties, null);
+ }
+
+ @Test
+ public void telemetry_additionalProperties() {
+ setMockObjectsForTelemetry();
+ when(options.isLogPersonalInformation()).thenReturn(true);
+
+ LuisRecognizer recognizer = new LuisRecognizer(options);
+ Map additionalProperties = new HashMap();
+ additionalProperties.put("test", "testvalue");
+ additionalProperties.put("foo", "foovalue");
+ Map telemetryMetrics = new HashMap();
+ telemetryMetrics.put("test", 3.1416);
+ telemetryMetrics.put("foo", 2.11);
+ try {
+ recognizer.recognize(turnContext, additionalProperties, telemetryMetrics).get();
+ } catch (InterruptedException | ExecutionException e) {
+ e.printStackTrace();
+ }
+ Map expectedProperties = new HashMap();
+ expectedProperties.put("intentScore", "0.4");
+ expectedProperties.put("intent2", "Test");
+ expectedProperties.put("entities", "{}");
+ expectedProperties.put("intentScore2", "0.2");
+ expectedProperties.put("applicationId", "b31aeaf3-3511-495b-a07f-571fc873214b");
+ expectedProperties.put("intent", "Greeting");
+ expectedProperties.put("fromId", "Activity-from-ID");
+ expectedProperties.put("sentimentLabel", "neutral");
+ expectedProperties.put("question", "Random Message");
+ expectedProperties.put("test", "testvalue");
+ expectedProperties.put("foo", "foovalue");
+
+ verify(telemetryClient, atLeastOnce()).trackEvent("LuisResult", expectedProperties, telemetryMetrics);
+ }
+
+ @Test
+ public void telemetry_additionalPropertiesOverrideProperty() {
+ setMockObjectsForTelemetry();
+ when(options.isLogPersonalInformation()).thenReturn(true);
+
+ LuisRecognizer recognizer = new LuisRecognizer(options);
+ Map additionalProperties = new HashMap();
+ additionalProperties.put("intentScore", "1.15");
+ additionalProperties.put("foo", "foovalue");
+ Map telemetryMetrics = new HashMap();
+ telemetryMetrics.put("test", 3.1416);
+ telemetryMetrics.put("foo", 2.11);
+ try {
+ recognizer.recognize(turnContext, additionalProperties, telemetryMetrics).get();
+ } catch (InterruptedException | ExecutionException e) {
+ e.printStackTrace();
+ }
+ Map expectedProperties = new HashMap();
+ expectedProperties.put("intentScore", "1.15");
+ expectedProperties.put("intent2", "Test");
+ expectedProperties.put("entities", "{}");
+ expectedProperties.put("intentScore2", "0.2");
+ expectedProperties.put("applicationId", "b31aeaf3-3511-495b-a07f-571fc873214b");
+ expectedProperties.put("intent", "Greeting");
+ expectedProperties.put("fromId", "Activity-from-ID");
+ expectedProperties.put("sentimentLabel", "neutral");
+ expectedProperties.put("question", "Random Message");
+ expectedProperties.put("foo", "foovalue");
+
+ verify(telemetryClient, atLeastOnce()).trackEvent("LuisResult", expectedProperties, telemetryMetrics);
+ }
+
+ private void setMockObjectsForTelemetry() {
+ Activity activity = new Activity(ActivityTypes.MESSAGE);
+ activity.setText("Random Message");
+ activity.setType(ActivityTypes.MESSAGE);
+ activity.setChannelId("EmptyContext");
+ ChannelAccount channelAccount = new ChannelAccount();
+ channelAccount.setId("Activity-from-ID");
+ activity.setFrom(channelAccount);
+ when(turnContext.getActivity())
+ .thenReturn(activity);
+
+ when(luisApplication.getApplicationId())
+ .thenReturn("b31aeaf3-3511-495b-a07f-571fc873214b");
+
+ when(options.getTelemetryClient()).thenReturn(telemetryClient);
+
+ when(options.getApplication())
+ .thenReturn(luisApplication);
+ RecognizerResult mockedResult = getMockedResult();
+ mockedResult.setText("Random Message");
+ doReturn(CompletableFuture.supplyAsync(() -> mockedResult))
+ .when(options)
+ .recognizeInternal(
+ any(TurnContext.class));
+ }
+}
diff --git a/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/Composite1.json b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/Composite1.json
new file mode 100644
index 000000000..69ef1c20a
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/Composite1.json
@@ -0,0 +1,1971 @@
+{
+ "entities": {
+ "$instance": {
+ "begin": [
+ {
+ "endIndex": 12,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 0,
+ "text": "12 years old",
+ "type": "builtin.age"
+ }
+ ],
+ "Composite1": [
+ {
+ "endIndex": 306,
+ "modelType": "Composite Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 0,
+ "text": "12 years old and 3 days old and monday july 3rd, 2019 and every monday and between 3am and 5:30am and 4 acres and 4 pico meters and chrimc@hotmail.com and $4 and $4.25 and also 32 and 210.4 and first and 10% and 10.5% and 425-555-1234 and 3 degrees and -27.5 degrees c and the next one and the previous one",
+ "type": "Composite1"
+ }
+ ],
+ "end": [
+ {
+ "endIndex": 27,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 17,
+ "text": "3 days old",
+ "type": "builtin.age"
+ }
+ ],
+ "endpos": [
+ {
+ "endIndex": 47,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 44,
+ "text": "3rd",
+ "type": "builtin.ordinalV2"
+ }
+ ],
+ "max": [
+ {
+ "endIndex": 167,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 162,
+ "text": "$4.25",
+ "type": "builtin.currency"
+ }
+ ],
+ "ordinalV2": [
+ {
+ "endIndex": 199,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 194,
+ "text": "first",
+ "type": "builtin.ordinalV2"
+ },
+ {
+ "endIndex": 285,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 277,
+ "text": "next one",
+ "type": "builtin.ordinalV2.relative"
+ },
+ {
+ "endIndex": 306,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 294,
+ "text": "previous one",
+ "type": "builtin.ordinalV2.relative"
+ }
+ ]
+ },
+ "begin": [
+ {
+ "number": 12,
+ "units": "Year"
+ }
+ ],
+ "Composite1": [
+ {
+ "$instance": {
+ "datetime": [
+ {
+ "endIndex": 8,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 0,
+ "text": "12 years",
+ "type": "builtin.datetimeV2.duration"
+ },
+ {
+ "endIndex": 23,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 17,
+ "text": "3 days",
+ "type": "builtin.datetimeV2.duration"
+ },
+ {
+ "endIndex": 53,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 32,
+ "text": "monday july 3rd, 2019",
+ "type": "builtin.datetimeV2.date"
+ },
+ {
+ "endIndex": 70,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 58,
+ "text": "every monday",
+ "type": "builtin.datetimeV2.set"
+ },
+ {
+ "endIndex": 97,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 75,
+ "text": "between 3am and 5:30am",
+ "type": "builtin.datetimeV2.timerange"
+ }
+ ],
+ "dimension": [
+ {
+ "endIndex": 109,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 102,
+ "text": "4 acres",
+ "type": "builtin.dimension"
+ },
+ {
+ "endIndex": 127,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 114,
+ "text": "4 pico meters",
+ "type": "builtin.dimension"
+ }
+ ],
+ "email": [
+ {
+ "endIndex": 150,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 132,
+ "text": "chrimc@hotmail.com",
+ "type": "builtin.email"
+ }
+ ],
+ "money": [
+ {
+ "endIndex": 157,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 155,
+ "text": "$4",
+ "type": "builtin.currency"
+ }
+ ],
+ "number": [
+ {
+ "endIndex": 2,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 0,
+ "text": "12",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 18,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 17,
+ "text": "3",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 53,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 49,
+ "text": "2019",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 92,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 91,
+ "text": "5",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 103,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 102,
+ "text": "4",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 115,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 114,
+ "text": "4",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 157,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 156,
+ "text": "4",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 167,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 163,
+ "text": "4.25",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 179,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 177,
+ "text": "32",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 189,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 184,
+ "text": "210.4",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 206,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 204,
+ "text": "10",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 216,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 212,
+ "text": "10.5",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 225,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 222,
+ "text": "425",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 229,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 226,
+ "text": "555",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 234,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 230,
+ "text": "1234",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 240,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 239,
+ "text": "3",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 258,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 253,
+ "text": "-27.5",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 285,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 282,
+ "text": "one",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 306,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 303,
+ "text": "one",
+ "type": "builtin.number"
+ }
+ ],
+ "percentage": [
+ {
+ "endIndex": 207,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 204,
+ "text": "10%",
+ "type": "builtin.percentage"
+ },
+ {
+ "endIndex": 217,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 212,
+ "text": "10.5%",
+ "type": "builtin.percentage"
+ }
+ ],
+ "phonenumber": [
+ {
+ "endIndex": 234,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "score": 0.9,
+ "startIndex": 222,
+ "text": "425-555-1234",
+ "type": "builtin.phonenumber"
+ }
+ ],
+ "temperature": [
+ {
+ "endIndex": 248,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 239,
+ "text": "3 degrees",
+ "type": "builtin.temperature"
+ },
+ {
+ "endIndex": 268,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 253,
+ "text": "-27.5 degrees c",
+ "type": "builtin.temperature"
+ }
+ ]
+ },
+ "datetime": [
+ {
+ "timex": [
+ "P12Y"
+ ],
+ "type": "duration"
+ },
+ {
+ "timex": [
+ "P3D"
+ ],
+ "type": "duration"
+ },
+ {
+ "timex": [
+ "2019-07-03"
+ ],
+ "type": "date"
+ },
+ {
+ "timex": [
+ "XXXX-WXX-1"
+ ],
+ "type": "set"
+ },
+ {
+ "timex": [
+ "(T03,T05:30,PT2H30M)"
+ ],
+ "type": "timerange"
+ }
+ ],
+ "dimension": [
+ {
+ "number": 4,
+ "units": "Acre"
+ },
+ {
+ "number": 4,
+ "units": "Picometer"
+ }
+ ],
+ "email": [
+ "chrimc@hotmail.com"
+ ],
+ "money": [
+ {
+ "number": 4,
+ "units": "Dollar"
+ }
+ ],
+ "number": [
+ 12,
+ 3,
+ 2019,
+ 5,
+ 4,
+ 4,
+ 4,
+ 4.25,
+ 32,
+ 210.4,
+ 10,
+ 10.5,
+ 425,
+ 555,
+ 1234,
+ 3,
+ -27.5,
+ 1,
+ 1
+ ],
+ "percentage": [
+ 10,
+ 10.5
+ ],
+ "phonenumber": [
+ "425-555-1234"
+ ],
+ "temperature": [
+ {
+ "number": 3,
+ "units": "Degree"
+ },
+ {
+ "number": -27.5,
+ "units": "C"
+ }
+ ]
+ }
+ ],
+ "end": [
+ {
+ "number": 3,
+ "units": "Day"
+ }
+ ],
+ "endpos": [
+ {
+ "offset": 3,
+ "relativeTo": "start"
+ }
+ ],
+ "max": [
+ {
+ "number": 4.25,
+ "units": "Dollar"
+ }
+ ],
+ "ordinalV2": [
+ {
+ "offset": 1,
+ "relativeTo": "start"
+ },
+ {
+ "offset": 1,
+ "relativeTo": "current"
+ },
+ {
+ "offset": -1,
+ "relativeTo": "current"
+ }
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 1.54311692E-06
+ },
+ "Delivery": {
+ "score": 0.000280677923
+ },
+ "EntityTests": {
+ "score": 0.958614767
+ },
+ "Greeting": {
+ "score": 8.076372E-07
+ },
+ "Help": {
+ "score": 4.74059061E-06
+ },
+ "None": {
+ "score": 0.0101076821
+ },
+ "Roles": {
+ "score": 0.191202149
+ },
+ "search": {
+ "score": 0.00475360872
+ },
+ "SpecifyName": {
+ "score": 7.367716E-05
+ },
+ "Travel": {
+ "score": 0.00232480234
+ },
+ "Weather_GetForecast": {
+ "score": 0.0141556319
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "text": "12 years old and 3 days old and monday july 3rd, 2019 and every monday and between 3am and 5:30am and 4 acres and 4 pico meters and chrimc@hotmail.com and $4 and $4.25 and also 32 and 210.4 and first and 10% and 10.5% and 425-555-1234 and 3 degrees and -27.5 degrees c and the next one and the previous one",
+ "v2": {
+ "options": {
+ "IncludeAllIntents": true,
+ "IncludeInstanceData": true,
+ "LogPersonalInformation": false,
+ "Timeout": 100000.0
+ },
+ "response": {
+ "compositeEntities": [
+ {
+ "children": [
+ {
+ "type": "builtin.datetimeV2.duration",
+ "value": "12 years"
+ },
+ {
+ "type": "builtin.datetimeV2.duration",
+ "value": "3 days"
+ },
+ {
+ "type": "builtin.datetimeV2.date",
+ "value": "monday july 3rd, 2019"
+ },
+ {
+ "type": "builtin.datetimeV2.set",
+ "value": "every monday"
+ },
+ {
+ "type": "builtin.datetimeV2.timerange",
+ "value": "between 3am and 5:30am"
+ },
+ {
+ "type": "builtin.dimension",
+ "value": "4 acres"
+ },
+ {
+ "type": "builtin.dimension",
+ "value": "4 pico meters"
+ },
+ {
+ "type": "builtin.email",
+ "value": "chrimc@hotmail.com"
+ },
+ {
+ "type": "builtin.currency",
+ "value": "$4"
+ },
+ {
+ "type": "builtin.number",
+ "value": "12"
+ },
+ {
+ "type": "builtin.number",
+ "value": "3"
+ },
+ {
+ "type": "builtin.number",
+ "value": "2019"
+ },
+ {
+ "type": "builtin.number",
+ "value": "5"
+ },
+ {
+ "type": "builtin.number",
+ "value": "4"
+ },
+ {
+ "type": "builtin.number",
+ "value": "4"
+ },
+ {
+ "type": "builtin.number",
+ "value": "4"
+ },
+ {
+ "type": "builtin.number",
+ "value": "4.25"
+ },
+ {
+ "type": "builtin.number",
+ "value": "32"
+ },
+ {
+ "type": "builtin.number",
+ "value": "210.4"
+ },
+ {
+ "type": "builtin.number",
+ "value": "10"
+ },
+ {
+ "type": "builtin.number",
+ "value": "10.5"
+ },
+ {
+ "type": "builtin.number",
+ "value": "425"
+ },
+ {
+ "type": "builtin.number",
+ "value": "555"
+ },
+ {
+ "type": "builtin.number",
+ "value": "1234"
+ },
+ {
+ "type": "builtin.number",
+ "value": "3"
+ },
+ {
+ "type": "builtin.number",
+ "value": "-27.5"
+ },
+ {
+ "type": "builtin.number",
+ "value": "one"
+ },
+ {
+ "type": "builtin.number",
+ "value": "one"
+ },
+ {
+ "type": "builtin.percentage",
+ "value": "10%"
+ },
+ {
+ "type": "builtin.percentage",
+ "value": "10.5%"
+ },
+ {
+ "type": "builtin.phonenumber",
+ "value": "425-555-1234"
+ },
+ {
+ "type": "builtin.temperature",
+ "value": "3 degrees"
+ },
+ {
+ "type": "builtin.temperature",
+ "value": "-27.5 degrees c"
+ }
+ ],
+ "parentType": "Composite1",
+ "value": "12 years old and 3 days old and monday july 3rd , 2019 and every monday and between 3am and 5 : 30am and 4 acres and 4 pico meters and chrimc @ hotmail . com and $ 4 and $ 4 . 25 and also 32 and 210 . 4 and first and 10 % and 10 . 5 % and 425 - 555 - 1234 and 3 degrees and - 27 . 5 degrees c and the next one and the previous one"
+ }
+ ],
+ "entities": [
+ {
+ "endIndex": 305,
+ "entity": "12 years old and 3 days old and monday july 3rd , 2019 and every monday and between 3am and 5 : 30am and 4 acres and 4 pico meters and chrimc @ hotmail . com and $ 4 and $ 4 . 25 and also 32 and 210 . 4 and first and 10 % and 10 . 5 % and 425 - 555 - 1234 and 3 degrees and - 27 . 5 degrees c and the next one and the previous one",
+ "score": 0.9074669,
+ "startIndex": 0,
+ "type": "Composite1"
+ },
+ {
+ "endIndex": 1,
+ "entity": "12",
+ "resolution": {
+ "subtype": "integer",
+ "value": "12"
+ },
+ "startIndex": 0,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 17,
+ "entity": "3",
+ "resolution": {
+ "subtype": "integer",
+ "value": "3"
+ },
+ "startIndex": 17,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 52,
+ "entity": "2019",
+ "resolution": {
+ "subtype": "integer",
+ "value": "2019"
+ },
+ "startIndex": 49,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 91,
+ "entity": "5",
+ "resolution": {
+ "subtype": "integer",
+ "value": "5"
+ },
+ "startIndex": 91,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 102,
+ "entity": "4",
+ "resolution": {
+ "subtype": "integer",
+ "value": "4"
+ },
+ "startIndex": 102,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 114,
+ "entity": "4",
+ "resolution": {
+ "subtype": "integer",
+ "value": "4"
+ },
+ "startIndex": 114,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 156,
+ "entity": "4",
+ "resolution": {
+ "subtype": "integer",
+ "value": "4"
+ },
+ "startIndex": 156,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 166,
+ "entity": "4.25",
+ "resolution": {
+ "subtype": "decimal",
+ "value": "4.25"
+ },
+ "startIndex": 163,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 178,
+ "entity": "32",
+ "resolution": {
+ "subtype": "integer",
+ "value": "32"
+ },
+ "startIndex": 177,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 188,
+ "entity": "210.4",
+ "resolution": {
+ "subtype": "decimal",
+ "value": "210.4"
+ },
+ "startIndex": 184,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 205,
+ "entity": "10",
+ "resolution": {
+ "subtype": "integer",
+ "value": "10"
+ },
+ "startIndex": 204,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 215,
+ "entity": "10.5",
+ "resolution": {
+ "subtype": "decimal",
+ "value": "10.5"
+ },
+ "startIndex": 212,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 224,
+ "entity": "425",
+ "resolution": {
+ "subtype": "integer",
+ "value": "425"
+ },
+ "startIndex": 222,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 228,
+ "entity": "555",
+ "resolution": {
+ "subtype": "integer",
+ "value": "555"
+ },
+ "startIndex": 226,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 233,
+ "entity": "1234",
+ "resolution": {
+ "subtype": "integer",
+ "value": "1234"
+ },
+ "startIndex": 230,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 239,
+ "entity": "3",
+ "resolution": {
+ "subtype": "integer",
+ "value": "3"
+ },
+ "startIndex": 239,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 257,
+ "entity": "-27.5",
+ "resolution": {
+ "subtype": "decimal",
+ "value": "-27.5"
+ },
+ "startIndex": 253,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 284,
+ "entity": "one",
+ "resolution": {
+ "subtype": "integer",
+ "value": "1"
+ },
+ "startIndex": 282,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 305,
+ "entity": "one",
+ "resolution": {
+ "subtype": "integer",
+ "value": "1"
+ },
+ "startIndex": 303,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 11,
+ "entity": "12 years old",
+ "resolution": {
+ "unit": "Year",
+ "value": "12"
+ },
+ "role": "begin",
+ "startIndex": 0,
+ "type": "builtin.age"
+ },
+ {
+ "endIndex": 26,
+ "entity": "3 days old",
+ "resolution": {
+ "unit": "Day",
+ "value": "3"
+ },
+ "role": "end",
+ "startIndex": 17,
+ "type": "builtin.age"
+ },
+ {
+ "endIndex": 7,
+ "entity": "12 years",
+ "resolution": {
+ "values": [
+ {
+ "timex": "P12Y",
+ "type": "duration",
+ "value": "378432000"
+ }
+ ]
+ },
+ "startIndex": 0,
+ "type": "builtin.datetimeV2.duration"
+ },
+ {
+ "endIndex": 22,
+ "entity": "3 days",
+ "resolution": {
+ "values": [
+ {
+ "timex": "P3D",
+ "type": "duration",
+ "value": "259200"
+ }
+ ]
+ },
+ "startIndex": 17,
+ "type": "builtin.datetimeV2.duration"
+ },
+ {
+ "endIndex": 52,
+ "entity": "monday july 3rd, 2019",
+ "resolution": {
+ "values": [
+ {
+ "timex": "2019-07-03",
+ "type": "date",
+ "value": "2019-07-03"
+ }
+ ]
+ },
+ "startIndex": 32,
+ "type": "builtin.datetimeV2.date"
+ },
+ {
+ "endIndex": 69,
+ "entity": "every monday",
+ "resolution": {
+ "values": [
+ {
+ "timex": "XXXX-WXX-1",
+ "type": "set",
+ "value": "not resolved"
+ }
+ ]
+ },
+ "startIndex": 58,
+ "type": "builtin.datetimeV2.set"
+ },
+ {
+ "endIndex": 96,
+ "entity": "between 3am and 5:30am",
+ "resolution": {
+ "values": [
+ {
+ "end": "05:30:00",
+ "start": "03:00:00",
+ "timex": "(T03,T05:30,PT2H30M)",
+ "type": "timerange"
+ }
+ ]
+ },
+ "startIndex": 75,
+ "type": "builtin.datetimeV2.timerange"
+ },
+ {
+ "endIndex": 108,
+ "entity": "4 acres",
+ "resolution": {
+ "unit": "Acre",
+ "value": "4"
+ },
+ "startIndex": 102,
+ "type": "builtin.dimension"
+ },
+ {
+ "endIndex": 126,
+ "entity": "4 pico meters",
+ "resolution": {
+ "unit": "Picometer",
+ "value": "4"
+ },
+ "startIndex": 114,
+ "type": "builtin.dimension"
+ },
+ {
+ "endIndex": 149,
+ "entity": "chrimc@hotmail.com",
+ "resolution": {
+ "value": "chrimc@hotmail.com"
+ },
+ "startIndex": 132,
+ "type": "builtin.email"
+ },
+ {
+ "endIndex": 156,
+ "entity": "$4",
+ "resolution": {
+ "unit": "Dollar",
+ "value": "4"
+ },
+ "startIndex": 155,
+ "type": "builtin.currency"
+ },
+ {
+ "endIndex": 166,
+ "entity": "$4.25",
+ "resolution": {
+ "unit": "Dollar",
+ "value": "4.25"
+ },
+ "role": "max",
+ "startIndex": 162,
+ "type": "builtin.currency"
+ },
+ {
+ "endIndex": 46,
+ "entity": "3rd",
+ "resolution": {
+ "offset": "3",
+ "relativeTo": "start"
+ },
+ "role": "endpos",
+ "startIndex": 44,
+ "type": "builtin.ordinalV2"
+ },
+ {
+ "endIndex": 198,
+ "entity": "first",
+ "resolution": {
+ "offset": "1",
+ "relativeTo": "start"
+ },
+ "startIndex": 194,
+ "type": "builtin.ordinalV2"
+ },
+ {
+ "endIndex": 284,
+ "entity": "next one",
+ "resolution": {
+ "offset": "1",
+ "relativeTo": "current"
+ },
+ "startIndex": 277,
+ "type": "builtin.ordinalV2.relative"
+ },
+ {
+ "endIndex": 305,
+ "entity": "previous one",
+ "resolution": {
+ "offset": "-1",
+ "relativeTo": "current"
+ },
+ "startIndex": 294,
+ "type": "builtin.ordinalV2.relative"
+ },
+ {
+ "endIndex": 206,
+ "entity": "10%",
+ "resolution": {
+ "value": "10%"
+ },
+ "startIndex": 204,
+ "type": "builtin.percentage"
+ },
+ {
+ "endIndex": 216,
+ "entity": "10.5%",
+ "resolution": {
+ "value": "10.5%"
+ },
+ "startIndex": 212,
+ "type": "builtin.percentage"
+ },
+ {
+ "endIndex": 233,
+ "entity": "425-555-1234",
+ "resolution": {
+ "score": "0.9",
+ "value": "425-555-1234"
+ },
+ "startIndex": 222,
+ "type": "builtin.phonenumber"
+ },
+ {
+ "endIndex": 247,
+ "entity": "3 degrees",
+ "resolution": {
+ "unit": "Degree",
+ "value": "3"
+ },
+ "startIndex": 239,
+ "type": "builtin.temperature"
+ },
+ {
+ "endIndex": 267,
+ "entity": "-27.5 degrees c",
+ "resolution": {
+ "unit": "C",
+ "value": "-27.5"
+ },
+ "startIndex": 253,
+ "type": "builtin.temperature"
+ }
+ ],
+ "intents": [
+ {
+ "intent": "EntityTests",
+ "score": 0.958614767
+ },
+ {
+ "intent": "Roles",
+ "score": 0.191202149
+ },
+ {
+ "intent": "Weather.GetForecast",
+ "score": 0.0141556319
+ },
+ {
+ "intent": "None",
+ "score": 0.0101076821
+ },
+ {
+ "intent": "search",
+ "score": 0.00475360872
+ },
+ {
+ "intent": "Travel",
+ "score": 0.00232480234
+ },
+ {
+ "intent": "Delivery",
+ "score": 0.000280677923
+ },
+ {
+ "intent": "SpecifyName",
+ "score": 7.367716E-05
+ },
+ {
+ "intent": "Help",
+ "score": 4.74059061E-06
+ },
+ {
+ "intent": "Cancel",
+ "score": 1.54311692E-06
+ },
+ {
+ "intent": "Greeting",
+ "score": 8.076372E-07
+ }
+ ],
+ "query": "12 years old and 3 days old and monday july 3rd, 2019 and every monday and between 3am and 5:30am and 4 acres and 4 pico meters and chrimc@hotmail.com and $4 and $4.25 and also 32 and 210.4 and first and 10% and 10.5% and 425-555-1234 and 3 degrees and -27.5 degrees c and the next one and the previous one",
+ "sentimentAnalysis": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "topScoringIntent": {
+ "intent": "EntityTests",
+ "score": 0.958614767
+ }
+ }
+ },
+ "v3": {
+ "options": {
+ "IncludeAllIntents": true,
+ "IncludeAPIResults": true,
+ "IncludeInstanceData": true,
+ "Log": true,
+ "PreferExternalEntities": true,
+ "Slot": "production"
+ },
+ "response": {
+ "prediction": {
+ "entities": {
+ "$instance": {
+ "begin": [
+ {
+ "length": 12,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "begin",
+ "startIndex": 0,
+ "text": "12 years old",
+ "type": "builtin.age"
+ }
+ ],
+ "Composite1": [
+ {
+ "length": 306,
+ "modelType": "Composite Entity Extractor",
+ "modelTypeId": 4,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 0,
+ "text": "12 years old and 3 days old and monday july 3rd, 2019 and every monday and between 3am and 5:30am and 4 acres and 4 pico meters and chrimc@hotmail.com and $4 and $4.25 and also 32 and 210.4 and first and 10% and 10.5% and 425-555-1234 and 3 degrees and -27.5 degrees c and the next one and the previous one",
+ "type": "Composite1"
+ }
+ ],
+ "end": [
+ {
+ "length": 10,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "end",
+ "startIndex": 17,
+ "text": "3 days old",
+ "type": "builtin.age"
+ }
+ ],
+ "endpos": [
+ {
+ "length": 3,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "endpos",
+ "startIndex": 44,
+ "text": "3rd",
+ "type": "builtin.ordinalV2"
+ }
+ ],
+ "max": [
+ {
+ "length": 5,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "max",
+ "startIndex": 162,
+ "text": "$4.25",
+ "type": "builtin.currency"
+ }
+ ],
+ "ordinalV2": [
+ {
+ "length": 5,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 194,
+ "text": "first",
+ "type": "builtin.ordinalV2"
+ },
+ {
+ "length": 8,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 277,
+ "text": "next one",
+ "type": "builtin.ordinalV2.relative"
+ },
+ {
+ "length": 12,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 294,
+ "text": "previous one",
+ "type": "builtin.ordinalV2.relative"
+ }
+ ]
+ },
+ "begin": [
+ {
+ "number": 12,
+ "units": "Year"
+ }
+ ],
+ "Composite1": [
+ {
+ "$instance": {
+ "datetimeV2": [
+ {
+ "length": 8,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 0,
+ "text": "12 years",
+ "type": "builtin.datetimeV2.duration"
+ },
+ {
+ "length": 6,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 17,
+ "text": "3 days",
+ "type": "builtin.datetimeV2.duration"
+ },
+ {
+ "length": 21,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 32,
+ "text": "monday july 3rd, 2019",
+ "type": "builtin.datetimeV2.date"
+ },
+ {
+ "length": 12,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 58,
+ "text": "every monday",
+ "type": "builtin.datetimeV2.set"
+ },
+ {
+ "length": 22,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 75,
+ "text": "between 3am and 5:30am",
+ "type": "builtin.datetimeV2.timerange"
+ }
+ ],
+ "dimension": [
+ {
+ "length": 7,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 102,
+ "text": "4 acres",
+ "type": "builtin.dimension"
+ },
+ {
+ "length": 13,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 114,
+ "text": "4 pico meters",
+ "type": "builtin.dimension"
+ }
+ ],
+ "email": [
+ {
+ "length": 18,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 132,
+ "text": "chrimc@hotmail.com",
+ "type": "builtin.email"
+ }
+ ],
+ "money": [
+ {
+ "length": 2,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 155,
+ "text": "$4",
+ "type": "builtin.currency"
+ }
+ ],
+ "number": [
+ {
+ "length": 2,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 0,
+ "text": "12",
+ "type": "builtin.number"
+ },
+ {
+ "length": 1,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 17,
+ "text": "3",
+ "type": "builtin.number"
+ },
+ {
+ "length": 4,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 49,
+ "text": "2019",
+ "type": "builtin.number"
+ },
+ {
+ "length": 1,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 91,
+ "text": "5",
+ "type": "builtin.number"
+ },
+ {
+ "length": 1,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 102,
+ "text": "4",
+ "type": "builtin.number"
+ },
+ {
+ "length": 1,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 114,
+ "text": "4",
+ "type": "builtin.number"
+ },
+ {
+ "length": 1,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 156,
+ "text": "4",
+ "type": "builtin.number"
+ },
+ {
+ "length": 4,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 163,
+ "text": "4.25",
+ "type": "builtin.number"
+ },
+ {
+ "length": 2,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 177,
+ "text": "32",
+ "type": "builtin.number"
+ },
+ {
+ "length": 5,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 184,
+ "text": "210.4",
+ "type": "builtin.number"
+ },
+ {
+ "length": 2,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 204,
+ "text": "10",
+ "type": "builtin.number"
+ },
+ {
+ "length": 4,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 212,
+ "text": "10.5",
+ "type": "builtin.number"
+ },
+ {
+ "length": 3,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 222,
+ "text": "425",
+ "type": "builtin.number"
+ },
+ {
+ "length": 3,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 226,
+ "text": "555",
+ "type": "builtin.number"
+ },
+ {
+ "length": 4,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 230,
+ "text": "1234",
+ "type": "builtin.number"
+ },
+ {
+ "length": 1,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 239,
+ "text": "3",
+ "type": "builtin.number"
+ },
+ {
+ "length": 5,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 253,
+ "text": "-27.5",
+ "type": "builtin.number"
+ },
+ {
+ "length": 3,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 282,
+ "text": "one",
+ "type": "builtin.number"
+ },
+ {
+ "length": 3,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 303,
+ "text": "one",
+ "type": "builtin.number"
+ }
+ ],
+ "percentage": [
+ {
+ "length": 3,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 204,
+ "text": "10%",
+ "type": "builtin.percentage"
+ },
+ {
+ "length": 5,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 212,
+ "text": "10.5%",
+ "type": "builtin.percentage"
+ }
+ ],
+ "phonenumber": [
+ {
+ "length": 12,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "score": 0.9,
+ "startIndex": 222,
+ "text": "425-555-1234",
+ "type": "builtin.phonenumber"
+ }
+ ],
+ "temperature": [
+ {
+ "length": 9,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 239,
+ "text": "3 degrees",
+ "type": "builtin.temperature"
+ },
+ {
+ "length": 15,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 253,
+ "text": "-27.5 degrees c",
+ "type": "builtin.temperature"
+ }
+ ]
+ },
+ "datetimeV2": [
+ {
+ "type": "duration",
+ "values": [
+ {
+ "resolution": [
+ {
+ "value": "378432000"
+ }
+ ],
+ "timex": "P12Y"
+ }
+ ]
+ },
+ {
+ "type": "duration",
+ "values": [
+ {
+ "resolution": [
+ {
+ "value": "259200"
+ }
+ ],
+ "timex": "P3D"
+ }
+ ]
+ },
+ {
+ "type": "date",
+ "values": [
+ {
+ "resolution": [
+ {
+ "value": "2019-07-03"
+ }
+ ],
+ "timex": "2019-07-03"
+ }
+ ]
+ },
+ {
+ "type": "set",
+ "values": [
+ {
+ "resolution": [
+ {
+ "value": "not resolved"
+ }
+ ],
+ "timex": "XXXX-WXX-1"
+ }
+ ]
+ },
+ {
+ "type": "timerange",
+ "values": [
+ {
+ "resolution": [
+ {
+ "end": "05:30:00",
+ "start": "03:00:00"
+ }
+ ],
+ "timex": "(T03,T05:30,PT2H30M)"
+ }
+ ]
+ }
+ ],
+ "dimension": [
+ {
+ "number": 4,
+ "units": "Acre"
+ },
+ {
+ "number": 4,
+ "units": "Picometer"
+ }
+ ],
+ "email": [
+ "chrimc@hotmail.com"
+ ],
+ "money": [
+ {
+ "number": 4,
+ "units": "Dollar"
+ }
+ ],
+ "number": [
+ 12,
+ 3,
+ 2019,
+ 5,
+ 4,
+ 4,
+ 4,
+ 4.25,
+ 32,
+ 210.4,
+ 10,
+ 10.5,
+ 425,
+ 555,
+ 1234,
+ 3,
+ -27.5,
+ 1,
+ 1
+ ],
+ "percentage": [
+ 10,
+ 10.5
+ ],
+ "phonenumber": [
+ "425-555-1234"
+ ],
+ "temperature": [
+ {
+ "number": 3,
+ "units": "Degree"
+ },
+ {
+ "number": -27.5,
+ "units": "C"
+ }
+ ]
+ }
+ ],
+ "end": [
+ {
+ "number": 3,
+ "units": "Day"
+ }
+ ],
+ "endpos": [
+ {
+ "offset": 3,
+ "relativeTo": "start"
+ }
+ ],
+ "max": [
+ {
+ "number": 4.25,
+ "units": "Dollar"
+ }
+ ],
+ "ordinalV2": [
+ {
+ "offset": 1,
+ "relativeTo": "start"
+ },
+ {
+ "offset": 1,
+ "relativeTo": "current"
+ },
+ {
+ "offset": -1,
+ "relativeTo": "current"
+ }
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 1.54311692E-06
+ },
+ "Delivery": {
+ "score": 0.000280677923
+ },
+ "EntityTests": {
+ "score": 0.958614767
+ },
+ "Greeting": {
+ "score": 8.076372E-07
+ },
+ "Help": {
+ "score": 4.74059061E-06
+ },
+ "None": {
+ "score": 0.0101076821
+ },
+ "Roles": {
+ "score": 0.191202149
+ },
+ "search": {
+ "score": 0.00475360872
+ },
+ "SpecifyName": {
+ "score": 7.367716E-05
+ },
+ "Travel": {
+ "score": 0.00232480234
+ },
+ "Weather.GetForecast": {
+ "score": 0.0141556319
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "topIntent": "EntityTests"
+ },
+ "query": "12 years old and 3 days old and monday july 3rd, 2019 and every monday and between 3am and 5:30am and 4 acres and 4 pico meters and chrimc@hotmail.com and $4 and $4.25 and also 32 and 210.4 and first and 10% and 10.5% and 425-555-1234 and 3 degrees and -27.5 degrees c and the next one and the previous one"
+ }
+ }
+}
diff --git a/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/Composite2.json b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/Composite2.json
new file mode 100644
index 000000000..5d79c500f
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/Composite2.json
@@ -0,0 +1,435 @@
+{
+ "entities": {
+ "$instance": {
+ "Composite2": [
+ {
+ "endIndex": 69,
+ "modelType": "Composite Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 0,
+ "text": "http://foo.com is where you can fly from seattle to dallas via denver",
+ "type": "Composite2"
+ }
+ ],
+ "geographyV2": [
+ {
+ "endIndex": 48,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 41,
+ "text": "seattle",
+ "type": "builtin.geographyV2.city"
+ }
+ ],
+ "oldURL": [
+ {
+ "endIndex": 14,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 0,
+ "text": "http://foo.com",
+ "type": "builtin.url"
+ }
+ ]
+ },
+ "Composite2": [
+ {
+ "$instance": {
+ "City": [
+ {
+ "endIndex": 69,
+ "modelType": "Hierarchical Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 63,
+ "text": "denver",
+ "type": "City"
+ }
+ ],
+ "From": [
+ {
+ "endIndex": 48,
+ "modelType": "Hierarchical Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 41,
+ "text": "seattle",
+ "type": "City::From"
+ }
+ ],
+ "To": [
+ {
+ "endIndex": 58,
+ "modelType": "Hierarchical Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 52,
+ "text": "dallas",
+ "type": "City::To"
+ }
+ ]
+ },
+ "City": [
+ "denver"
+ ],
+ "From": [
+ "seattle"
+ ],
+ "To": [
+ "dallas"
+ ]
+ }
+ ],
+ "geographyV2": [
+ {
+ "location": "seattle",
+ "type": "city"
+ }
+ ],
+ "oldURL": [
+ "http://foo.com"
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 0.000219483933
+ },
+ "Delivery": {
+ "score": 0.00125586381
+ },
+ "EntityTests": {
+ "score": 0.956510365
+ },
+ "Greeting": {
+ "score": 0.00014909108
+ },
+ "Help": {
+ "score": 0.0005319686
+ },
+ "None": {
+ "score": 0.003814332
+ },
+ "Roles": {
+ "score": 0.02785043
+ },
+ "search": {
+ "score": 0.00132194813
+ },
+ "SpecifyName": {
+ "score": 0.000922683743
+ },
+ "Travel": {
+ "score": 0.01013992
+ },
+ "Weather_GetForecast": {
+ "score": 0.0228957664
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "text": "http://foo.com is where you can fly from seattle to dallas via denver",
+ "v2": {
+ "options": {
+ "IncludeAllIntents": true,
+ "IncludeInstanceData": true,
+ "LogPersonalInformation": false,
+ "Timeout": 100000.0
+ },
+ "response": {
+ "compositeEntities": [
+ {
+ "children": [
+ {
+ "type": "City",
+ "value": "denver"
+ },
+ {
+ "type": "City::From",
+ "value": "seattle"
+ },
+ {
+ "type": "City::To",
+ "value": "dallas"
+ }
+ ],
+ "parentType": "Composite2",
+ "value": "http : / / foo . com is where you can fly from seattle to dallas via denver"
+ }
+ ],
+ "entities": [
+ {
+ "endIndex": 47,
+ "entity": "seattle",
+ "score": 0.997107,
+ "startIndex": 41,
+ "type": "City::From"
+ },
+ {
+ "endIndex": 57,
+ "entity": "dallas",
+ "score": 0.998217642,
+ "startIndex": 52,
+ "type": "City::To"
+ },
+ {
+ "endIndex": 68,
+ "entity": "denver",
+ "score": 0.991177261,
+ "startIndex": 63,
+ "type": "City"
+ },
+ {
+ "endIndex": 68,
+ "entity": "http : / / foo . com is where you can fly from seattle to dallas via denver",
+ "score": 0.9807907,
+ "startIndex": 0,
+ "type": "Composite2"
+ },
+ {
+ "endIndex": 47,
+ "entity": "seattle",
+ "startIndex": 41,
+ "type": "builtin.geographyV2.city"
+ },
+ {
+ "endIndex": 13,
+ "entity": "http://foo.com",
+ "resolution": {
+ "value": "http://foo.com"
+ },
+ "role": "oldURL",
+ "startIndex": 0,
+ "type": "builtin.url"
+ }
+ ],
+ "intents": [
+ {
+ "intent": "EntityTests",
+ "score": 0.956510365
+ },
+ {
+ "intent": "Roles",
+ "score": 0.02785043
+ },
+ {
+ "intent": "Weather.GetForecast",
+ "score": 0.0228957664
+ },
+ {
+ "intent": "Travel",
+ "score": 0.01013992
+ },
+ {
+ "intent": "None",
+ "score": 0.003814332
+ },
+ {
+ "intent": "search",
+ "score": 0.00132194813
+ },
+ {
+ "intent": "Delivery",
+ "score": 0.00125586381
+ },
+ {
+ "intent": "SpecifyName",
+ "score": 0.000922683743
+ },
+ {
+ "intent": "Help",
+ "score": 0.0005319686
+ },
+ {
+ "intent": "Cancel",
+ "score": 0.000219483933
+ },
+ {
+ "intent": "Greeting",
+ "score": 0.00014909108
+ }
+ ],
+ "query": "http://foo.com is where you can fly from seattle to dallas via denver",
+ "sentimentAnalysis": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "topScoringIntent": {
+ "intent": "EntityTests",
+ "score": 0.956510365
+ }
+ }
+ },
+ "v3": {
+ "options": {
+ "IncludeAllIntents": true,
+ "IncludeAPIResults": true,
+ "IncludeInstanceData": true,
+ "Log": true,
+ "PreferExternalEntities": true,
+ "Slot": "production"
+ },
+ "response": {
+ "prediction": {
+ "entities": {
+ "$instance": {
+ "Composite2": [
+ {
+ "length": 69,
+ "modelType": "Composite Entity Extractor",
+ "modelTypeId": 4,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 0,
+ "text": "http://foo.com is where you can fly from seattle to dallas via denver",
+ "type": "Composite2"
+ }
+ ],
+ "geographyV2": [
+ {
+ "length": 7,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 41,
+ "text": "seattle",
+ "type": "builtin.geographyV2.city"
+ }
+ ],
+ "oldURL": [
+ {
+ "length": 14,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "oldURL",
+ "startIndex": 0,
+ "text": "http://foo.com",
+ "type": "builtin.url"
+ }
+ ]
+ },
+ "Composite2": [
+ {
+ "$instance": {
+ "City": [
+ {
+ "length": 6,
+ "modelType": "Hierarchical Entity Extractor",
+ "modelTypeId": 3,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 63,
+ "text": "denver",
+ "type": "City"
+ }
+ ],
+ "City::From": [
+ {
+ "length": 7,
+ "modelType": "Hierarchical Entity Extractor",
+ "modelTypeId": 3,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 41,
+ "text": "seattle",
+ "type": "City::From"
+ }
+ ],
+ "City::To": [
+ {
+ "length": 6,
+ "modelType": "Hierarchical Entity Extractor",
+ "modelTypeId": 3,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 52,
+ "text": "dallas",
+ "type": "City::To"
+ }
+ ]
+ },
+ "City": [
+ "denver"
+ ],
+ "City::From": [
+ "seattle"
+ ],
+ "City::To": [
+ "dallas"
+ ]
+ }
+ ],
+ "geographyV2": [
+ {
+ "type": "city",
+ "value": "seattle"
+ }
+ ],
+ "oldURL": [
+ "http://foo.com"
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 0.000219483933
+ },
+ "Delivery": {
+ "score": 0.00125586381
+ },
+ "EntityTests": {
+ "score": 0.956510365
+ },
+ "Greeting": {
+ "score": 0.00014909108
+ },
+ "Help": {
+ "score": 0.0005319686
+ },
+ "None": {
+ "score": 0.003814332
+ },
+ "Roles": {
+ "score": 0.02785043
+ },
+ "search": {
+ "score": 0.00132194813
+ },
+ "SpecifyName": {
+ "score": 0.000922683743
+ },
+ "Travel": {
+ "score": 0.01013992
+ },
+ "Weather.GetForecast": {
+ "score": 0.0228957664
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "topIntent": "EntityTests"
+ },
+ "query": "http://foo.com is where you can fly from seattle to dallas via denver"
+ }
+ }
+}
diff --git a/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/Composite3.json b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/Composite3.json
new file mode 100644
index 000000000..863187133
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/Composite3.json
@@ -0,0 +1,461 @@
+{
+ "entities": {
+ "$instance": {
+ "Destination": [
+ {
+ "endIndex": 33,
+ "modelType": "Composite Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "score": 0.9818366,
+ "startIndex": 25,
+ "text": "12346 WA",
+ "type": "Address"
+ }
+ ],
+ "Source": [
+ {
+ "endIndex": 21,
+ "modelType": "Composite Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "score": 0.9345161,
+ "startIndex": 13,
+ "text": "12345 VA",
+ "type": "Address"
+ }
+ ]
+ },
+ "Destination": [
+ {
+ "$instance": {
+ "number": [
+ {
+ "endIndex": 30,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 25,
+ "text": "12346",
+ "type": "builtin.number"
+ }
+ ],
+ "State": [
+ {
+ "endIndex": 33,
+ "modelType": "Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "score": 0.9893861,
+ "startIndex": 31,
+ "text": "WA",
+ "type": "State"
+ }
+ ]
+ },
+ "number": [
+ 12346
+ ],
+ "State": [
+ "WA"
+ ]
+ }
+ ],
+ "Source": [
+ {
+ "$instance": {
+ "number": [
+ {
+ "endIndex": 18,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 13,
+ "text": "12345",
+ "type": "builtin.number"
+ }
+ ],
+ "State": [
+ {
+ "endIndex": 21,
+ "modelType": "Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "score": 0.941649556,
+ "startIndex": 19,
+ "text": "VA",
+ "type": "State"
+ }
+ ]
+ },
+ "number": [
+ 12345
+ ],
+ "State": [
+ "VA"
+ ]
+ }
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 1.01764708E-09
+ },
+ "Delivery": {
+ "score": 0.00238572317
+ },
+ "EntityTests": {
+ "score": 4.757576E-10
+ },
+ "Greeting": {
+ "score": 1.0875E-09
+ },
+ "Help": {
+ "score": 1.01764708E-09
+ },
+ "None": {
+ "score": 1.17844979E-06
+ },
+ "Roles": {
+ "score": 0.999911964
+ },
+ "search": {
+ "score": 9.494859E-06
+ },
+ "SpecifyName": {
+ "score": 3.0666667E-09
+ },
+ "Travel": {
+ "score": 3.09763345E-06
+ },
+ "Weather_GetForecast": {
+ "score": 1.02792524E-06
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "text": "Deliver from 12345 VA to 12346 WA",
+ "v2": {
+ "options": {
+ "IncludeAllIntents": true,
+ "IncludeInstanceData": true,
+ "LogPersonalInformation": false,
+ "Timeout": 100000.0
+ },
+ "response": {
+ "compositeEntities": [
+ {
+ "children": [
+ {
+ "type": "builtin.number",
+ "value": "12345"
+ },
+ {
+ "type": "State",
+ "value": "va"
+ }
+ ],
+ "parentType": "Address",
+ "value": "12345 va"
+ },
+ {
+ "children": [
+ {
+ "type": "builtin.number",
+ "value": "12346"
+ },
+ {
+ "type": "State",
+ "value": "wa"
+ }
+ ],
+ "parentType": "Address",
+ "value": "12346 wa"
+ }
+ ],
+ "entities": [
+ {
+ "endIndex": 20,
+ "entity": "va",
+ "score": 0.9684971,
+ "startIndex": 19,
+ "type": "State"
+ },
+ {
+ "endIndex": 32,
+ "entity": "wa",
+ "score": 0.988121331,
+ "startIndex": 31,
+ "type": "State"
+ },
+ {
+ "endIndex": 20,
+ "entity": "12345 va",
+ "role": "Source",
+ "score": 0.9659546,
+ "startIndex": 13,
+ "type": "Address"
+ },
+ {
+ "endIndex": 32,
+ "entity": "12346 wa",
+ "role": "Destination",
+ "score": 0.987832844,
+ "startIndex": 25,
+ "type": "Address"
+ },
+ {
+ "endIndex": 17,
+ "entity": "12345",
+ "resolution": {
+ "subtype": "integer",
+ "value": "12345"
+ },
+ "startIndex": 13,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 29,
+ "entity": "12346",
+ "resolution": {
+ "subtype": "integer",
+ "value": "12346"
+ },
+ "startIndex": 25,
+ "type": "builtin.number"
+ }
+ ],
+ "intents": [
+ {
+ "intent": "Roles",
+ "score": 0.99991256
+ },
+ {
+ "intent": "Delivery",
+ "score": 0.00239894539
+ },
+ {
+ "intent": "None",
+ "score": 1.18518381E-06
+ },
+ {
+ "intent": "Weather.GetForecast",
+ "score": 1.03386708E-06
+ },
+ {
+ "intent": "search",
+ "score": 9.45E-09
+ },
+ {
+ "intent": "SpecifyName",
+ "score": 3.08333337E-09
+ },
+ {
+ "intent": "Travel",
+ "score": 3.08333337E-09
+ },
+ {
+ "intent": "Greeting",
+ "score": 1.09375E-09
+ },
+ {
+ "intent": "Cancel",
+ "score": 1.02352937E-09
+ },
+ {
+ "intent": "Help",
+ "score": 1.02352937E-09
+ },
+ {
+ "intent": "EntityTests",
+ "score": 4.617647E-10
+ }
+ ],
+ "query": "Deliver from 12345 VA to 12346 WA",
+ "sentimentAnalysis": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "topScoringIntent": {
+ "intent": "Roles",
+ "score": 0.99991256
+ }
+ }
+ },
+ "v3": {
+ "options": {
+ "IncludeAllIntents": true,
+ "IncludeAPIResults": true,
+ "IncludeInstanceData": true,
+ "Log": true,
+ "PreferExternalEntities": true,
+ "Slot": "production",
+ "Version": "GeoPeople"
+ },
+ "response": {
+ "prediction": {
+ "entities": {
+ "$instance": {
+ "Destination": [
+ {
+ "length": 8,
+ "modelType": "Composite Entity Extractor",
+ "modelTypeId": 4,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "Destination",
+ "score": 0.9818366,
+ "startIndex": 25,
+ "text": "12346 WA",
+ "type": "Address"
+ }
+ ],
+ "Source": [
+ {
+ "length": 8,
+ "modelType": "Composite Entity Extractor",
+ "modelTypeId": 4,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "Source",
+ "score": 0.9345161,
+ "startIndex": 13,
+ "text": "12345 VA",
+ "type": "Address"
+ }
+ ]
+ },
+ "Destination": [
+ {
+ "$instance": {
+ "number": [
+ {
+ "length": 5,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 25,
+ "text": "12346",
+ "type": "builtin.number"
+ }
+ ],
+ "State": [
+ {
+ "length": 2,
+ "modelType": "Entity Extractor",
+ "modelTypeId": 1,
+ "recognitionSources": [
+ "model"
+ ],
+ "score": 0.9893861,
+ "startIndex": 31,
+ "text": "WA",
+ "type": "State"
+ }
+ ]
+ },
+ "number": [
+ 12346
+ ],
+ "State": [
+ "WA"
+ ]
+ }
+ ],
+ "Source": [
+ {
+ "$instance": {
+ "number": [
+ {
+ "length": 5,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 13,
+ "text": "12345",
+ "type": "builtin.number"
+ }
+ ],
+ "State": [
+ {
+ "length": 2,
+ "modelType": "Entity Extractor",
+ "modelTypeId": 1,
+ "recognitionSources": [
+ "model"
+ ],
+ "score": 0.941649556,
+ "startIndex": 19,
+ "text": "VA",
+ "type": "State"
+ }
+ ]
+ },
+ "number": [
+ 12345
+ ],
+ "State": [
+ "VA"
+ ]
+ }
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 1.01764708E-09
+ },
+ "Delivery": {
+ "score": 0.00238572317
+ },
+ "EntityTests": {
+ "score": 4.757576E-10
+ },
+ "Greeting": {
+ "score": 1.0875E-09
+ },
+ "Help": {
+ "score": 1.01764708E-09
+ },
+ "None": {
+ "score": 1.17844979E-06
+ },
+ "Roles": {
+ "score": 0.999911964
+ },
+ "search": {
+ "score": 9.494859E-06
+ },
+ "SpecifyName": {
+ "score": 3.0666667E-09
+ },
+ "Travel": {
+ "score": 3.09763345E-06
+ },
+ "Weather.GetForecast": {
+ "score": 1.02792524E-06
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "topIntent": "Roles"
+ },
+ "query": "Deliver from 12345 VA to 12346 WA"
+ }
+ }
+}
diff --git a/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/Contoso App.json b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/Contoso App.json
new file mode 100644
index 000000000..330e757bd
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/Contoso App.json
@@ -0,0 +1,2541 @@
+{
+ "luis_schema_version": "7.0.0",
+ "intents": [
+ {
+ "name": "Cancel",
+ "features": []
+ },
+ {
+ "name": "Delivery",
+ "features": []
+ },
+ {
+ "name": "EntityTests",
+ "features": []
+ },
+ {
+ "name": "Greeting",
+ "features": []
+ },
+ {
+ "name": "Help",
+ "features": []
+ },
+ {
+ "name": "None",
+ "features": []
+ },
+ {
+ "name": "Roles",
+ "features": []
+ },
+ {
+ "name": "search",
+ "features": []
+ },
+ {
+ "name": "SpecifyName",
+ "features": []
+ },
+ {
+ "name": "Travel",
+ "features": []
+ },
+ {
+ "name": "Weather.GetForecast",
+ "features": []
+ }
+ ],
+ "entities": [
+ {
+ "name": "Name",
+ "children": [],
+ "roles": [
+ "liker",
+ "likee"
+ ],
+ "features": []
+ },
+ {
+ "name": "State",
+ "children": [],
+ "roles": [],
+ "features": []
+ },
+ {
+ "name": "Weather.Location",
+ "children": [],
+ "roles": [
+ "source",
+ "destination"
+ ],
+ "features": []
+ }
+ ],
+ "hierarchicals": [
+ {
+ "name": "City",
+ "children": [
+ {
+ "name": "To"
+ },
+ {
+ "name": "From"
+ }
+ ],
+ "roles": [],
+ "features": []
+ }
+ ],
+ "composites": [
+ {
+ "name": "Address",
+ "children": [
+ {
+ "name": "number"
+ },
+ {
+ "name": "State"
+ }
+ ],
+ "roles": [
+ "Source",
+ "Destination"
+ ],
+ "features": []
+ },
+ {
+ "name": "Composite1",
+ "children": [
+ {
+ "name": "age"
+ },
+ {
+ "name": "datetimeV2"
+ },
+ {
+ "name": "dimension"
+ },
+ {
+ "name": "email"
+ },
+ {
+ "name": "money"
+ },
+ {
+ "name": "number"
+ },
+ {
+ "name": "percentage"
+ },
+ {
+ "name": "phonenumber"
+ },
+ {
+ "name": "temperature"
+ }
+ ],
+ "roles": [],
+ "features": []
+ },
+ {
+ "name": "Composite2",
+ "children": [
+ {
+ "name": "Airline"
+ },
+ {
+ "name": "City"
+ },
+ {
+ "name": "url"
+ },
+ {
+ "name": "City::From"
+ },
+ {
+ "name": "City::To"
+ },
+ {
+ "name": "Weather.Location"
+ }
+ ],
+ "roles": [],
+ "features": []
+ }
+ ],
+ "closedLists": [
+ {
+ "name": "Airline",
+ "subLists": [
+ {
+ "canonicalForm": "Delta",
+ "list": [
+ "DL"
+ ]
+ },
+ {
+ "canonicalForm": "Alaska",
+ "list": []
+ },
+ {
+ "canonicalForm": "United",
+ "list": []
+ },
+ {
+ "canonicalForm": "Virgin",
+ "list": [
+ "DL"
+ ]
+ }
+ ],
+ "roles": [
+ "Buyer",
+ "Seller"
+ ]
+ }
+ ],
+ "prebuiltEntities": [
+ {
+ "name": "age",
+ "roles": [
+ "end",
+ "begin"
+ ]
+ },
+ {
+ "name": "datetimeV2",
+ "roles": [
+ "leave",
+ "arrive"
+ ]
+ },
+ {
+ "name": "dimension",
+ "roles": [
+ "length",
+ "width"
+ ]
+ },
+ {
+ "name": "email",
+ "roles": [
+ "sender",
+ "receiver"
+ ]
+ },
+ {
+ "name": "geographyV2",
+ "roles": [
+ "endloc",
+ "startloc"
+ ]
+ },
+ {
+ "name": "money",
+ "roles": [
+ "max",
+ "min"
+ ]
+ },
+ {
+ "name": "number",
+ "roles": []
+ },
+ {
+ "name": "ordinalV2",
+ "roles": [
+ "endpos",
+ "startpos"
+ ]
+ },
+ {
+ "name": "percentage",
+ "roles": [
+ "maximum",
+ "minimum"
+ ]
+ },
+ {
+ "name": "personName",
+ "roles": [
+ "child",
+ "parent"
+ ]
+ },
+ {
+ "name": "phonenumber",
+ "roles": [
+ "old",
+ "newPhone"
+ ]
+ },
+ {
+ "name": "temperature",
+ "roles": [
+ "a",
+ "b"
+ ]
+ },
+ {
+ "name": "url",
+ "roles": [
+ "oldURL"
+ ]
+ }
+ ],
+ "utterances": [
+ {
+ "text": "\" i need to know the temperature at bangor , sme \"",
+ "intent": "Weather.GetForecast",
+ "entities": []
+ },
+ {
+ "text": "\" tell me perth weather , sclimate & temperature at australia \"",
+ "intent": "None",
+ "entities": [
+ {
+ "entity": "Weather.Location",
+ "startPos": 10,
+ "endPos": 14,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "$2 and $4.25",
+ "intent": "EntityTests",
+ "entities": []
+ },
+ {
+ "text": "$4 and $4.25",
+ "intent": "EntityTests",
+ "entities": []
+ },
+ {
+ "text": "$4 and $99",
+ "intent": "EntityTests",
+ "entities": []
+ },
+ {
+ "text": "$4.25 and $4",
+ "intent": "EntityTests",
+ "entities": []
+ },
+ {
+ "text": "$99 and $4.50",
+ "intent": "EntityTests",
+ "entities": []
+ },
+ {
+ "text": "10 years old and 4 years old",
+ "intent": "EntityTests",
+ "entities": []
+ },
+ {
+ "text": "12 years old and 3 days old",
+ "intent": "EntityTests",
+ "entities": []
+ },
+ {
+ "text": "12 years old and 3 days old and monday july 3rd and every monday and between 3am and 5:30am and 4 acres and 4 pico meters and chrimc@hotmail.com and $4 and $4.25 and also 32 and 210.4 and first and 10% and 10.5% and 425-555-1234 and 3 degrees and -27.5 degrees c and the next one and the previous one",
+ "intent": "EntityTests",
+ "entities": [
+ {
+ "entity": "Composite1",
+ "startPos": 0,
+ "endPos": 299,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "12% and 8%",
+ "intent": "EntityTests",
+ "entities": []
+ },
+ {
+ "text": "12% to 8%",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "percentage",
+ "role": "minimum",
+ "startPos": 0,
+ "endPos": 2,
+ "children": []
+ },
+ {
+ "entity": "percentage",
+ "role": "maximum",
+ "startPos": 7,
+ "endPos": 8,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "3 degrees and -27.5 degrees c",
+ "intent": "EntityTests",
+ "entities": []
+ },
+ {
+ "text": "3 inches long by 2 inches wide",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "dimension",
+ "role": "length",
+ "startPos": 0,
+ "endPos": 7,
+ "children": []
+ },
+ {
+ "entity": "dimension",
+ "role": "width",
+ "startPos": 17,
+ "endPos": 24,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "3 inches long by 2 inches wide and 5% to 10% and are you between 6 years old and 8 years old and can i trade kb457 for kb922 and change 425-777-1212 to 206-666-4123 and did delta buy virgin and did the rain from hawaii get to redmond and http://foo.com changed to http://blah.com and i like between 68 degrees and 72 degrees and john likes mary and leave 3pm and arrive 5pm and pay between $400 and $500 and send chrimc@hotmail.com from emad@gmail.com",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "dimension",
+ "role": "length",
+ "startPos": 0,
+ "endPos": 7,
+ "children": []
+ },
+ {
+ "entity": "dimension",
+ "role": "width",
+ "startPos": 17,
+ "endPos": 24,
+ "children": []
+ },
+ {
+ "entity": "percentage",
+ "role": "minimum",
+ "startPos": 35,
+ "endPos": 36,
+ "children": []
+ },
+ {
+ "entity": "percentage",
+ "role": "maximum",
+ "startPos": 41,
+ "endPos": 43,
+ "children": []
+ },
+ {
+ "entity": "age",
+ "role": "begin",
+ "startPos": 65,
+ "endPos": 75,
+ "children": []
+ },
+ {
+ "entity": "age",
+ "role": "end",
+ "startPos": 81,
+ "endPos": 91,
+ "children": []
+ },
+ {
+ "entity": "Part",
+ "role": "buy",
+ "startPos": 119,
+ "endPos": 123,
+ "children": []
+ },
+ {
+ "entity": "Airline",
+ "role": "Buyer",
+ "startPos": 173,
+ "endPos": 177,
+ "children": []
+ },
+ {
+ "entity": "Airline",
+ "role": "Seller",
+ "startPos": 183,
+ "endPos": 188,
+ "children": []
+ },
+ {
+ "entity": "Weather.Location",
+ "role": "source",
+ "startPos": 212,
+ "endPos": 217,
+ "children": []
+ },
+ {
+ "entity": "Weather.Location",
+ "role": "destination",
+ "startPos": 226,
+ "endPos": 232,
+ "children": []
+ },
+ {
+ "entity": "temperature",
+ "role": "b",
+ "startPos": 314,
+ "endPos": 323,
+ "children": []
+ },
+ {
+ "entity": "Name",
+ "role": "liker",
+ "startPos": 329,
+ "endPos": 332,
+ "children": []
+ },
+ {
+ "entity": "Name",
+ "role": "likee",
+ "startPos": 340,
+ "endPos": 343,
+ "children": []
+ },
+ {
+ "entity": "datetimeV2",
+ "role": "leave",
+ "startPos": 355,
+ "endPos": 357,
+ "children": []
+ },
+ {
+ "entity": "datetimeV2",
+ "role": "arrive",
+ "startPos": 370,
+ "endPos": 372,
+ "children": []
+ },
+ {
+ "entity": "money",
+ "role": "min",
+ "startPos": 390,
+ "endPos": 393,
+ "children": []
+ },
+ {
+ "entity": "money",
+ "role": "max",
+ "startPos": 399,
+ "endPos": 402,
+ "children": []
+ },
+ {
+ "entity": "email",
+ "role": "receiver",
+ "startPos": 413,
+ "endPos": 430,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "4% and 5%",
+ "intent": "EntityTests",
+ "entities": []
+ },
+ {
+ "text": "4% to 12%",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "percentage",
+ "role": "minimum",
+ "startPos": 0,
+ "endPos": 1,
+ "children": []
+ },
+ {
+ "entity": "percentage",
+ "role": "maximum",
+ "startPos": 6,
+ "endPos": 8,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "425-555-1212",
+ "intent": "EntityTests",
+ "entities": []
+ },
+ {
+ "text": "425-555-1234",
+ "intent": "EntityTests",
+ "entities": []
+ },
+ {
+ "text": "5% to 10%",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "percentage",
+ "role": "minimum",
+ "startPos": 0,
+ "endPos": 1,
+ "children": []
+ },
+ {
+ "entity": "percentage",
+ "role": "maximum",
+ "startPos": 6,
+ "endPos": 8,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "8% and 12%",
+ "intent": "EntityTests",
+ "entities": []
+ },
+ {
+ "text": "8% and 14%",
+ "intent": "EntityTests",
+ "entities": []
+ },
+ {
+ "text": "8% and 9%",
+ "intent": "EntityTests",
+ "entities": []
+ },
+ {
+ "text": "8% to 12%",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "percentage",
+ "role": "minimum",
+ "startPos": 0,
+ "endPos": 1,
+ "children": []
+ },
+ {
+ "entity": "percentage",
+ "role": "maximum",
+ "startPos": 6,
+ "endPos": 8,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "9 feet long by 4 feet wide",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "dimension",
+ "role": "length",
+ "startPos": 0,
+ "endPos": 5,
+ "children": []
+ },
+ {
+ "entity": "dimension",
+ "role": "width",
+ "startPos": 15,
+ "endPos": 20,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "9.2% and 10.3%",
+ "intent": "EntityTests",
+ "entities": []
+ },
+ {
+ "text": "abort",
+ "intent": "Cancel",
+ "entities": []
+ },
+ {
+ "text": "and $10 and $20",
+ "intent": "EntityTests",
+ "entities": []
+ },
+ {
+ "text": "and $4 and $4.25",
+ "intent": "EntityTests",
+ "entities": []
+ },
+ {
+ "text": "and 4$",
+ "intent": "EntityTests",
+ "entities": []
+ },
+ {
+ "text": "and 425-765-5555",
+ "intent": "EntityTests",
+ "entities": []
+ },
+ {
+ "text": "and can i trade kb457 for kb922",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "Part",
+ "role": "sell",
+ "startPos": 16,
+ "endPos": 20,
+ "children": []
+ },
+ {
+ "entity": "Part",
+ "role": "buy",
+ "startPos": 26,
+ "endPos": 30,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "are you between 13 years old and 16 years old",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "age",
+ "role": "begin",
+ "startPos": 16,
+ "endPos": 27,
+ "children": []
+ },
+ {
+ "entity": "age",
+ "role": "end",
+ "startPos": 33,
+ "endPos": 44,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "are you between 4 years old and 7 years old",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "age",
+ "role": "begin",
+ "startPos": 16,
+ "endPos": 26,
+ "children": []
+ },
+ {
+ "entity": "age",
+ "role": "end",
+ "startPos": 32,
+ "endPos": 42,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "are you between 6 years old and 10 years old",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "age",
+ "role": "begin",
+ "startPos": 16,
+ "endPos": 26,
+ "children": []
+ },
+ {
+ "entity": "age",
+ "role": "end",
+ "startPos": 32,
+ "endPos": 43,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "are you between 6 years old and 8 years old",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "age",
+ "role": "end",
+ "startPos": 32,
+ "endPos": 42,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "assist",
+ "intent": "Help",
+ "entities": []
+ },
+ {
+ "text": "bart simpson",
+ "intent": "EntityTests",
+ "entities": []
+ },
+ {
+ "text": "bart simpson helps homer simpson",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "personName",
+ "role": "child",
+ "startPos": 0,
+ "endPos": 11,
+ "children": []
+ },
+ {
+ "entity": "personName",
+ "role": "parent",
+ "startPos": 19,
+ "endPos": 31,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "bart simpson is parent of lisa simpson to move calcutta to london",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "personName",
+ "role": "parent",
+ "startPos": 0,
+ "endPos": 11,
+ "children": []
+ },
+ {
+ "entity": "personName",
+ "role": "child",
+ "startPos": 26,
+ "endPos": 37,
+ "children": []
+ },
+ {
+ "entity": "geographyV2",
+ "role": "startloc",
+ "startPos": 47,
+ "endPos": 54,
+ "children": []
+ },
+ {
+ "entity": "geographyV2",
+ "role": "endloc",
+ "startPos": 59,
+ "endPos": 64,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "calcutta",
+ "intent": "EntityTests",
+ "entities": []
+ },
+ {
+ "text": "can i trade kb457 for kb922",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "Part",
+ "role": "sell",
+ "startPos": 12,
+ "endPos": 16,
+ "children": []
+ },
+ {
+ "entity": "Part",
+ "role": "buy",
+ "startPos": 22,
+ "endPos": 26,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "can i trade kb922 for kb457",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "Part",
+ "role": "sell",
+ "startPos": 12,
+ "endPos": 16,
+ "children": []
+ },
+ {
+ "entity": "Part",
+ "role": "buy",
+ "startPos": 22,
+ "endPos": 26,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "cancel",
+ "intent": "Delivery",
+ "entities": []
+ },
+ {
+ "text": "change 425-765-1111 to 425-888-4444",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "phonenumber",
+ "role": "old",
+ "startPos": 7,
+ "endPos": 18,
+ "children": []
+ },
+ {
+ "entity": "phonenumber",
+ "role": "newPhone",
+ "startPos": 23,
+ "endPos": 34,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "change 425-777-1212 to 206-666-4123",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "phonenumber",
+ "role": "old",
+ "startPos": 7,
+ "endPos": 18,
+ "children": []
+ },
+ {
+ "entity": "phonenumber",
+ "role": "newPhone",
+ "startPos": 23,
+ "endPos": 34,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "deliver 12345 va to 12346 wa",
+ "intent": "Delivery",
+ "entities": [
+ {
+ "entity": "Address",
+ "startPos": 8,
+ "endPos": 15,
+ "children": []
+ },
+ {
+ "entity": "State",
+ "startPos": 14,
+ "endPos": 15,
+ "children": []
+ },
+ {
+ "entity": "Address",
+ "startPos": 20,
+ "endPos": 27,
+ "children": []
+ },
+ {
+ "entity": "State",
+ "startPos": 26,
+ "endPos": 27,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "delivery address is in 45654 ga",
+ "intent": "Delivery",
+ "entities": [
+ {
+ "entity": "Address",
+ "startPos": 23,
+ "endPos": 30,
+ "children": []
+ },
+ {
+ "entity": "State",
+ "startPos": 29,
+ "endPos": 30,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "did delta buy virgin",
+ "intent": "Roles",
+ "entities": []
+ },
+ {
+ "text": "did delta buy virgin?",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "Airline",
+ "role": "Buyer",
+ "startPos": 4,
+ "endPos": 8,
+ "children": []
+ },
+ {
+ "entity": "Airline",
+ "role": "Seller",
+ "startPos": 14,
+ "endPos": 19,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "did the rain from hawaii get to redmond",
+ "intent": "Weather.GetForecast",
+ "entities": [
+ {
+ "entity": "Weather.Location",
+ "role": "source",
+ "startPos": 18,
+ "endPos": 23,
+ "children": []
+ },
+ {
+ "entity": "Weather.Location",
+ "role": "destination",
+ "startPos": 32,
+ "endPos": 38,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "did virgin buy delta",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "Airline",
+ "role": "Buyer",
+ "startPos": 4,
+ "endPos": 9,
+ "children": []
+ },
+ {
+ "entity": "Airline",
+ "role": "Seller",
+ "startPos": 15,
+ "endPos": 19,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "disregard",
+ "intent": "Cancel",
+ "entities": []
+ },
+ {
+ "text": "do not do it",
+ "intent": "Cancel",
+ "entities": []
+ },
+ {
+ "text": "do not do that",
+ "intent": "Cancel",
+ "entities": []
+ },
+ {
+ "text": "don't",
+ "intent": "Cancel",
+ "entities": []
+ },
+ {
+ "text": "don't do it",
+ "intent": "Cancel",
+ "entities": []
+ },
+ {
+ "text": "don't do that",
+ "intent": "Cancel",
+ "entities": []
+ },
+ {
+ "text": "email about dogs from chris and also cats",
+ "intent": "search",
+ "entities": []
+ },
+ {
+ "text": "fly from paris, texas to chicago via stork",
+ "intent": "EntityTests",
+ "entities": [
+ {
+ "entity": "Composite2",
+ "startPos": 0,
+ "endPos": 41,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "forecast in celcius",
+ "intent": "Weather.GetForecast",
+ "entities": []
+ },
+ {
+ "text": "get florence temperature in september",
+ "intent": "None",
+ "entities": [
+ {
+ "entity": "Weather.Location",
+ "startPos": 4,
+ "endPos": 11,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "get for me the weather conditions in sonoma county",
+ "intent": "None",
+ "entities": [
+ {
+ "entity": "Weather.Location",
+ "startPos": 37,
+ "endPos": 49,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "get the daily temperature greenwood indiana",
+ "intent": "None",
+ "entities": [
+ {
+ "entity": "Weather.Location",
+ "startPos": 26,
+ "endPos": 42,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "get the forcast for me",
+ "intent": "Weather.GetForecast",
+ "entities": []
+ },
+ {
+ "text": "get the weather at saint george utah",
+ "intent": "None",
+ "entities": [
+ {
+ "entity": "Weather.Location",
+ "startPos": 19,
+ "endPos": 35,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "go from 3rd to 5th",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "ordinalV2",
+ "role": "startpos",
+ "startPos": 8,
+ "endPos": 10,
+ "children": []
+ },
+ {
+ "entity": "ordinalV2",
+ "role": "endpos",
+ "startPos": 15,
+ "endPos": 17,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "go from first to last",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "ordinalV2",
+ "role": "startpos",
+ "startPos": 8,
+ "endPos": 12,
+ "children": []
+ },
+ {
+ "entity": "ordinalV2",
+ "role": "endpos",
+ "startPos": 17,
+ "endPos": 20,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "go from next to last to last move london to jakarta and homer simpson is the parent of lisa simpson",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "ordinalV2",
+ "role": "startpos",
+ "startPos": 8,
+ "endPos": 19,
+ "children": []
+ },
+ {
+ "entity": "geographyV2",
+ "role": "startloc",
+ "startPos": 34,
+ "endPos": 39,
+ "children": []
+ },
+ {
+ "entity": "geographyV2",
+ "role": "endloc",
+ "startPos": 44,
+ "endPos": 50,
+ "children": []
+ },
+ {
+ "entity": "personName",
+ "role": "parent",
+ "startPos": 56,
+ "endPos": 68,
+ "children": []
+ },
+ {
+ "entity": "personName",
+ "role": "child",
+ "startPos": 87,
+ "endPos": 98,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "good afternoon",
+ "intent": "Greeting",
+ "entities": []
+ },
+ {
+ "text": "good evening",
+ "intent": "Greeting",
+ "entities": []
+ },
+ {
+ "text": "good morning",
+ "intent": "Greeting",
+ "entities": []
+ },
+ {
+ "text": "good night",
+ "intent": "Greeting",
+ "entities": []
+ },
+ {
+ "text": "he is yousef",
+ "intent": "SpecifyName",
+ "entities": [
+ {
+ "entity": "Name",
+ "startPos": 6,
+ "endPos": 11,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "hello",
+ "intent": "Cancel",
+ "entities": []
+ },
+ {
+ "text": "hello bot",
+ "intent": "Greeting",
+ "entities": []
+ },
+ {
+ "text": "help",
+ "intent": "Help",
+ "entities": []
+ },
+ {
+ "text": "help me",
+ "intent": "Help",
+ "entities": []
+ },
+ {
+ "text": "help me please",
+ "intent": "Help",
+ "entities": []
+ },
+ {
+ "text": "help please",
+ "intent": "Help",
+ "entities": []
+ },
+ {
+ "text": "hi",
+ "intent": "Greeting",
+ "entities": []
+ },
+ {
+ "text": "hi bot",
+ "intent": "Greeting",
+ "entities": []
+ },
+ {
+ "text": "hi emad",
+ "intent": "Greeting",
+ "entities": []
+ },
+ {
+ "text": "his name is tom",
+ "intent": "SpecifyName",
+ "entities": [
+ {
+ "entity": "Name",
+ "startPos": 12,
+ "endPos": 14,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "hiya",
+ "intent": "Greeting",
+ "entities": []
+ },
+ {
+ "text": "homer simpson is parent of bart simpson",
+ "intent": "Roles",
+ "entities": []
+ },
+ {
+ "text": "homer simpson is parent of bart simpson to move jakarta to calcutta",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "personName",
+ "role": "child",
+ "startPos": 27,
+ "endPos": 38,
+ "children": []
+ },
+ {
+ "entity": "geographyV2",
+ "role": "startloc",
+ "startPos": 48,
+ "endPos": 54,
+ "children": []
+ },
+ {
+ "entity": "geographyV2",
+ "role": "endloc",
+ "startPos": 59,
+ "endPos": 66,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "homer simpson is parent of lisa simpson",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "personName",
+ "role": "parent",
+ "startPos": 0,
+ "endPos": 12,
+ "children": []
+ },
+ {
+ "entity": "personName",
+ "role": "child",
+ "startPos": 27,
+ "endPos": 38,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "how are you",
+ "intent": "Greeting",
+ "entities": []
+ },
+ {
+ "text": "how are you doing today?",
+ "intent": "Greeting",
+ "entities": []
+ },
+ {
+ "text": "how are you doing?",
+ "intent": "Greeting",
+ "entities": []
+ },
+ {
+ "text": "how are you today?",
+ "intent": "Greeting",
+ "entities": []
+ },
+ {
+ "text": "how much rain does chambersburg get a year",
+ "intent": "None",
+ "entities": [
+ {
+ "entity": "Weather.Location",
+ "startPos": 19,
+ "endPos": 30,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "howdy",
+ "intent": "Greeting",
+ "entities": []
+ },
+ {
+ "text": "how's it goig",
+ "intent": "Greeting",
+ "entities": []
+ },
+ {
+ "text": "http://blah.com changed to http://foo.com",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "url",
+ "role": "oldURL",
+ "startPos": 0,
+ "endPos": 14,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "http://blah.com is where you can fly from dallas to seattle via denver",
+ "intent": "EntityTests",
+ "entities": [
+ {
+ "entity": "Composite2",
+ "startPos": 0,
+ "endPos": 69,
+ "children": []
+ },
+ {
+ "entity": "City::From",
+ "startPos": 42,
+ "endPos": 47,
+ "children": []
+ },
+ {
+ "entity": "City::To",
+ "startPos": 52,
+ "endPos": 58,
+ "children": []
+ },
+ {
+ "entity": "City",
+ "startPos": 64,
+ "endPos": 69,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "http://foo.com",
+ "intent": "EntityTests",
+ "entities": []
+ },
+ {
+ "text": "http://foo.com changed to http://blah.com",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "url",
+ "role": "oldURL",
+ "startPos": 0,
+ "endPos": 13,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "http://foo.com is ok",
+ "intent": "EntityTests",
+ "entities": []
+ },
+ {
+ "text": "http://foo.com is where you can fly from seattle to dallas via denver",
+ "intent": "EntityTests",
+ "entities": [
+ {
+ "entity": "Composite2",
+ "startPos": 0,
+ "endPos": 68,
+ "children": []
+ },
+ {
+ "entity": "City::From",
+ "startPos": 41,
+ "endPos": 47,
+ "children": []
+ },
+ {
+ "entity": "City::To",
+ "startPos": 52,
+ "endPos": 57,
+ "children": []
+ },
+ {
+ "entity": "City",
+ "startPos": 63,
+ "endPos": 68,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "http://woof.com",
+ "intent": "EntityTests",
+ "entities": []
+ },
+ {
+ "text": "http://woof.com is where you can fly from seattle to dallas via chicago",
+ "intent": "EntityTests",
+ "entities": [
+ {
+ "entity": "Composite2",
+ "startPos": 0,
+ "endPos": 70,
+ "children": []
+ },
+ {
+ "entity": "City::From",
+ "startPos": 42,
+ "endPos": 48,
+ "children": []
+ },
+ {
+ "entity": "City::To",
+ "startPos": 53,
+ "endPos": 58,
+ "children": []
+ },
+ {
+ "entity": "City",
+ "startPos": 64,
+ "endPos": 70,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "http://woof.com is where you can fly from seattle to dallas via chicago on delta",
+ "intent": "EntityTests",
+ "entities": [
+ {
+ "entity": "Composite2",
+ "startPos": 0,
+ "endPos": 79,
+ "children": []
+ },
+ {
+ "entity": "City::From",
+ "startPos": 42,
+ "endPos": 48,
+ "children": []
+ },
+ {
+ "entity": "City::To",
+ "startPos": 53,
+ "endPos": 58,
+ "children": []
+ },
+ {
+ "entity": "City",
+ "startPos": 64,
+ "endPos": 70,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "https://foo.com is where you can get weather for seattle",
+ "intent": "Weather.GetForecast",
+ "entities": [
+ {
+ "entity": "Composite2",
+ "startPos": 0,
+ "endPos": 55,
+ "children": []
+ },
+ {
+ "entity": "Weather.Location",
+ "startPos": 49,
+ "endPos": 55,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "i am lili",
+ "intent": "SpecifyName",
+ "entities": [
+ {
+ "entity": "Name",
+ "startPos": 5,
+ "endPos": 8,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "i am stuck",
+ "intent": "Help",
+ "entities": []
+ },
+ {
+ "text": "i like between 68 degrees and 72 degrees",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "temperature",
+ "role": "a",
+ "startPos": 15,
+ "endPos": 24,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "i like between 72 degrees and 80 degrees",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "temperature",
+ "role": "a",
+ "startPos": 15,
+ "endPos": 24,
+ "children": []
+ },
+ {
+ "entity": "temperature",
+ "role": "b",
+ "startPos": 30,
+ "endPos": 39,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "i want this in 98052 wa",
+ "intent": "Delivery",
+ "entities": [
+ {
+ "entity": "Address",
+ "startPos": 15,
+ "endPos": 22,
+ "children": []
+ },
+ {
+ "entity": "State",
+ "startPos": 21,
+ "endPos": 22,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "i want to arrive at newyork",
+ "intent": "Travel",
+ "entities": [
+ {
+ "entity": "City::To",
+ "startPos": 20,
+ "endPos": 26,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "i want to fly out of seattle",
+ "intent": "Travel",
+ "entities": [
+ {
+ "entity": "City::From",
+ "startPos": 21,
+ "endPos": 27,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "i want to know the temperature at death valley",
+ "intent": "Weather.GetForecast",
+ "entities": [
+ {
+ "entity": "Weather.Location",
+ "startPos": 34,
+ "endPos": 45,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "i want to travel",
+ "intent": "Travel",
+ "entities": []
+ },
+ {
+ "text": "i want to travel from seattle to dallas",
+ "intent": "Travel",
+ "entities": [
+ {
+ "entity": "City::From",
+ "startPos": 22,
+ "endPos": 28,
+ "children": []
+ },
+ {
+ "entity": "City::To",
+ "startPos": 33,
+ "endPos": 38,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "i would like to cancel",
+ "intent": "Cancel",
+ "entities": []
+ },
+ {
+ "text": "i'll be leaving from cairo to paris",
+ "intent": "Travel",
+ "entities": [
+ {
+ "entity": "City::From",
+ "startPos": 21,
+ "endPos": 25,
+ "children": []
+ },
+ {
+ "entity": "City::To",
+ "startPos": 30,
+ "endPos": 34,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "i'm stuck",
+ "intent": "Help",
+ "entities": []
+ },
+ {
+ "text": "joeseph@hotmail.com",
+ "intent": "EntityTests",
+ "entities": []
+ },
+ {
+ "text": "john likes mary",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "Name",
+ "role": "liker",
+ "startPos": 0,
+ "endPos": 3,
+ "children": []
+ },
+ {
+ "entity": "Name",
+ "role": "likee",
+ "startPos": 11,
+ "endPos": 14,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "kb409 is cool",
+ "intent": "EntityTests",
+ "entities": []
+ },
+ {
+ "text": "leave 3pm and arrive 5pm",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "datetimeV2",
+ "role": "leave",
+ "startPos": 6,
+ "endPos": 8,
+ "children": []
+ },
+ {
+ "entity": "datetimeV2",
+ "role": "arrive",
+ "startPos": 21,
+ "endPos": 23,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "mayday",
+ "intent": "Help",
+ "entities": []
+ },
+ {
+ "text": "move calcutta to mumbai",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "geographyV2",
+ "role": "startloc",
+ "startPos": 5,
+ "endPos": 12,
+ "children": []
+ },
+ {
+ "entity": "geographyV2",
+ "role": "endloc",
+ "startPos": 17,
+ "endPos": 22,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "move jakarta to london",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "geographyV2",
+ "role": "startloc",
+ "startPos": 5,
+ "endPos": 11,
+ "children": []
+ },
+ {
+ "entity": "geographyV2",
+ "role": "endloc",
+ "startPos": 16,
+ "endPos": 21,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "move london to calcutta",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "geographyV2",
+ "role": "startloc",
+ "startPos": 5,
+ "endPos": 10,
+ "children": []
+ },
+ {
+ "entity": "geographyV2",
+ "role": "endloc",
+ "startPos": 15,
+ "endPos": 22,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "move london to jakarta",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "geographyV2",
+ "role": "startloc",
+ "startPos": 5,
+ "endPos": 10,
+ "children": []
+ },
+ {
+ "entity": "geographyV2",
+ "role": "endloc",
+ "startPos": 15,
+ "endPos": 21,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "my name is emad",
+ "intent": "SpecifyName",
+ "entities": [
+ {
+ "entity": "Name",
+ "startPos": 11,
+ "endPos": 14,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "my water bottle is green.",
+ "intent": "None",
+ "entities": []
+ },
+ {
+ "text": "never mind",
+ "intent": "Cancel",
+ "entities": []
+ },
+ {
+ "text": "no thanks",
+ "intent": "Cancel",
+ "entities": []
+ },
+ {
+ "text": "nope",
+ "intent": "Cancel",
+ "entities": []
+ },
+ {
+ "text": "pay between $4 and $4.25",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "money",
+ "role": "min",
+ "startPos": 12,
+ "endPos": 13,
+ "children": []
+ },
+ {
+ "entity": "money",
+ "role": "max",
+ "startPos": 19,
+ "endPos": 23,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "pay between $4 and $40",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "money",
+ "role": "min",
+ "startPos": 12,
+ "endPos": 13,
+ "children": []
+ },
+ {
+ "entity": "money",
+ "role": "max",
+ "startPos": 19,
+ "endPos": 21,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "pay between $400 and $500",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "money",
+ "role": "min",
+ "startPos": 12,
+ "endPos": 15,
+ "children": []
+ },
+ {
+ "entity": "money",
+ "role": "max",
+ "startPos": 21,
+ "endPos": 24,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "please cancel",
+ "intent": "Cancel",
+ "entities": []
+ },
+ {
+ "text": "please deliver february 2nd 2001",
+ "intent": "Delivery",
+ "entities": []
+ },
+ {
+ "text": "please deliver to 98033 wa",
+ "intent": "Delivery",
+ "entities": [
+ {
+ "entity": "Address",
+ "startPos": 18,
+ "endPos": 25,
+ "children": []
+ },
+ {
+ "entity": "State",
+ "startPos": 24,
+ "endPos": 25,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "please delivery it to 98033 wa",
+ "intent": "Delivery",
+ "entities": [
+ {
+ "entity": "Address",
+ "startPos": 22,
+ "endPos": 29,
+ "children": []
+ },
+ {
+ "entity": "State",
+ "startPos": 28,
+ "endPos": 29,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "please disregard",
+ "intent": "Cancel",
+ "entities": []
+ },
+ {
+ "text": "please help me",
+ "intent": "Help",
+ "entities": []
+ },
+ {
+ "text": "please stop",
+ "intent": "Cancel",
+ "entities": []
+ },
+ {
+ "text": "provide me by toronto weather please",
+ "intent": "Weather.GetForecast",
+ "entities": [
+ {
+ "entity": "Weather.Location",
+ "startPos": 14,
+ "endPos": 20,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "send bob@foo.com from chris@ark.com",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "email",
+ "role": "receiver",
+ "startPos": 5,
+ "endPos": 15,
+ "children": []
+ },
+ {
+ "entity": "email",
+ "role": "sender",
+ "startPos": 22,
+ "endPos": 34,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "send bob@hob.com from main@gmail.com",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "email",
+ "role": "receiver",
+ "startPos": 5,
+ "endPos": 15,
+ "children": []
+ },
+ {
+ "entity": "email",
+ "role": "sender",
+ "startPos": 22,
+ "endPos": 35,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "send cancel@foo.com from help@h.com",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "email",
+ "role": "receiver",
+ "startPos": 5,
+ "endPos": 18,
+ "children": []
+ },
+ {
+ "entity": "email",
+ "role": "sender",
+ "startPos": 25,
+ "endPos": 34,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "send chrimc@hotmail.com from emad@gmail.com",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "email",
+ "role": "receiver",
+ "startPos": 5,
+ "endPos": 22,
+ "children": []
+ },
+ {
+ "entity": "email",
+ "role": "sender",
+ "startPos": 29,
+ "endPos": 42,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "send chris@ark.com from bob@foo.com",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "email",
+ "role": "receiver",
+ "startPos": 5,
+ "endPos": 17,
+ "children": []
+ },
+ {
+ "entity": "email",
+ "role": "sender",
+ "startPos": 24,
+ "endPos": 34,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "send ham@ham.com from chr@live.com",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "email",
+ "role": "receiver",
+ "startPos": 5,
+ "endPos": 15,
+ "children": []
+ },
+ {
+ "entity": "email",
+ "role": "sender",
+ "startPos": 22,
+ "endPos": 33,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "send help@h.com from cancel@foo.com",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "email",
+ "role": "receiver",
+ "startPos": 5,
+ "endPos": 14,
+ "children": []
+ },
+ {
+ "entity": "email",
+ "role": "sender",
+ "startPos": 21,
+ "endPos": 34,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "send tom@foo.com from john@hotmail.com",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "email",
+ "role": "receiver",
+ "startPos": 5,
+ "endPos": 15,
+ "children": []
+ },
+ {
+ "entity": "email",
+ "role": "sender",
+ "startPos": 22,
+ "endPos": 37,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "show average rainfall for boise",
+ "intent": "None",
+ "entities": [
+ {
+ "entity": "Weather.Location",
+ "startPos": 26,
+ "endPos": 30,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "show me the forecast at alabama",
+ "intent": "Weather.GetForecast",
+ "entities": [
+ {
+ "entity": "Weather.Location",
+ "startPos": 24,
+ "endPos": 30,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "soliciting today ' s weather",
+ "intent": "Weather.GetForecast",
+ "entities": []
+ },
+ {
+ "text": "sos",
+ "intent": "Help",
+ "entities": []
+ },
+ {
+ "text": "start with the first one",
+ "intent": "Roles",
+ "entities": []
+ },
+ {
+ "text": "stop",
+ "intent": "Cancel",
+ "entities": []
+ },
+ {
+ "text": "temperature of delhi in celsius please",
+ "intent": "None",
+ "entities": [
+ {
+ "entity": "Weather.Location",
+ "startPos": 15,
+ "endPos": 19,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "the address is 66666 fl",
+ "intent": "Delivery",
+ "entities": [
+ {
+ "entity": "Address",
+ "startPos": 15,
+ "endPos": 22,
+ "children": []
+ },
+ {
+ "entity": "State",
+ "startPos": 21,
+ "endPos": 22,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "there is a large deep dish pizza in your future.",
+ "intent": "None",
+ "entities": []
+ },
+ {
+ "text": "this is chris",
+ "intent": "SpecifyName",
+ "entities": [
+ {
+ "entity": "Name",
+ "startPos": 8,
+ "endPos": 12,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "this is requested in 55555 ny",
+ "intent": "Delivery",
+ "entities": [
+ {
+ "entity": "Address",
+ "startPos": 21,
+ "endPos": 28,
+ "children": []
+ },
+ {
+ "entity": "State",
+ "startPos": 27,
+ "endPos": 28,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "tom likes susan",
+ "intent": "Roles",
+ "entities": [
+ {
+ "entity": "Name",
+ "role": "liker",
+ "startPos": 0,
+ "endPos": 2,
+ "children": []
+ },
+ {
+ "entity": "Name",
+ "role": "likee",
+ "startPos": 10,
+ "endPos": 14,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "was last year about this time as wet as it is now in the south ?",
+ "intent": "None",
+ "entities": [
+ {
+ "entity": "Weather.Location",
+ "startPos": 57,
+ "endPos": 61,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "what ' s the weather going to be like in hawaii ?",
+ "intent": "Weather.GetForecast",
+ "entities": [
+ {
+ "entity": "Weather.Location",
+ "startPos": 41,
+ "endPos": 46,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "what ' s the weather like in minneapolis",
+ "intent": "None",
+ "entities": [
+ {
+ "entity": "Weather.Location",
+ "startPos": 29,
+ "endPos": 39,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "what can i say",
+ "intent": "Help",
+ "entities": []
+ },
+ {
+ "text": "what can you do",
+ "intent": "Help",
+ "entities": []
+ },
+ {
+ "text": "what can you help me with",
+ "intent": "Help",
+ "entities": []
+ },
+ {
+ "text": "what do i do now?",
+ "intent": "Help",
+ "entities": []
+ },
+ {
+ "text": "what do i do?",
+ "intent": "Help",
+ "entities": []
+ },
+ {
+ "text": "what is the rain volume in sonoma county ?",
+ "intent": "None",
+ "entities": [
+ {
+ "entity": "Weather.Location",
+ "startPos": 27,
+ "endPos": 39,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "what is the weather in redmond ?",
+ "intent": "Weather.GetForecast",
+ "entities": [
+ {
+ "entity": "Weather.Location",
+ "startPos": 23,
+ "endPos": 29,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "what is the weather today at 10 day durham ?",
+ "intent": "Weather.GetForecast",
+ "entities": [
+ {
+ "entity": "Weather.Location",
+ "startPos": 36,
+ "endPos": 41,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "what to wear in march in california",
+ "intent": "None",
+ "entities": [
+ {
+ "entity": "Weather.Location",
+ "startPos": 25,
+ "endPos": 34,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "what will the weather be tomorrow in accord new york ?",
+ "intent": "Weather.GetForecast",
+ "entities": [
+ {
+ "entity": "Weather.Location",
+ "startPos": 37,
+ "endPos": 51,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "why doesn't this work ?",
+ "intent": "Help",
+ "entities": []
+ },
+ {
+ "text": "will it be raining in ranchi",
+ "intent": "Weather.GetForecast",
+ "entities": [
+ {
+ "entity": "Weather.Location",
+ "startPos": 22,
+ "endPos": 27,
+ "children": []
+ }
+ ]
+ },
+ {
+ "text": "will it rain this weekend",
+ "intent": "Weather.GetForecast",
+ "entities": []
+ },
+ {
+ "text": "will it snow today",
+ "intent": "Weather.GetForecast",
+ "entities": []
+ }
+ ],
+ "versionId": "0.2",
+ "name": "Contoso App V3",
+ "desc": "Default Intents for Azure Bot Service V2",
+ "culture": "en-us",
+ "tokenizerVersion": "1.0.0",
+ "patternAnyEntities": [
+ {
+ "name": "person",
+ "roles": [
+ "from",
+ "to"
+ ],
+ "explicitList": []
+ },
+ {
+ "name": "subject",
+ "roles": [
+ "extra"
+ ],
+ "explicitList": []
+ }
+ ],
+ "regex_entities": [
+ {
+ "name": "Part",
+ "regexPattern": "kb[0-9]+",
+ "roles": [
+ "sell",
+ "buy"
+ ]
+ }
+ ],
+ "phraselists": [],
+ "regex_features": [],
+ "patterns": [
+ {
+ "pattern": "deliver from {Address:Source} to {Address:Destination}",
+ "intent": "Roles"
+ },
+ {
+ "pattern": "email from {person:from} to {person:to}",
+ "intent": "search"
+ },
+ {
+ "pattern": "email about {subject} [from {person}] [and also {subject:extra}]",
+ "intent": "search"
+ }
+ ],
+ "settings": [
+ {
+ "name": "UseAllTrainingData",
+ "value": "true"
+ }
+ ]
+}
diff --git a/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/DateTimeReference.json b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/DateTimeReference.json
new file mode 100644
index 000000000..d7c01e6bc
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/DateTimeReference.json
@@ -0,0 +1,75 @@
+{
+ "entities": {
+ "Airline": [
+ [
+ "Delta"
+ ]
+ ],
+ "datetime": [
+ {
+ "timex": [
+ "2019-05-06"
+ ],
+ "type": "date"
+ }
+ ]
+ },
+ "intents": {
+ "EntityTests": {
+ "score": 0.190871954
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "text": "fly on delta tomorrow",
+ "v3": {
+ "options": {
+ "DateTimeReference": "05/05/2019 12:00:00",
+ "IncludeAllIntents": false,
+ "IncludeAPIResults": true,
+ "IncludeInstanceData": false,
+ "Log": true,
+ "PreferExternalEntities": true,
+ "Slot": "production"
+ },
+ "response": {
+ "prediction": {
+ "entities": {
+ "Airline": [
+ [
+ "Delta"
+ ]
+ ],
+ "datetimeV2": [
+ {
+ "type": "date",
+ "values": [
+ {
+ "resolution": [
+ {
+ "value": "2019-05-06"
+ }
+ ],
+ "timex": "2019-05-06"
+ }
+ ]
+ }
+ ]
+ },
+ "intents": {
+ "EntityTests": {
+ "score": 0.190871954
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "topIntent": "EntityTests"
+ },
+ "query": "fly on delta tomorrow"
+ }
+ }
+}
\ No newline at end of file
diff --git a/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/DynamicListsAndList.json b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/DynamicListsAndList.json
new file mode 100644
index 000000000..e973384fa
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/DynamicListsAndList.json
@@ -0,0 +1,221 @@
+{
+ "entities": {
+ "$instance": {
+ "Airline": [
+ {
+ "endIndex": 21,
+ "modelType": "List Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 4,
+ "text": "zimbabwe airlines",
+ "type": "Airline"
+ },
+ {
+ "endIndex": 33,
+ "modelType": "List Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 25,
+ "text": "deltaair",
+ "type": "Airline"
+ }
+ ],
+ "endloc": [
+ {
+ "endIndex": 12,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 4,
+ "text": "zimbabwe",
+ "type": "builtin.geographyV2.countryRegion"
+ }
+ ]
+ },
+ "Airline": [
+ [
+ "ZimAir"
+ ],
+ [
+ "DeltaAir"
+ ]
+ ],
+ "endloc": [
+ {
+ "location": "zimbabwe",
+ "type": "countryRegion"
+ }
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 0.006457624
+ },
+ "Delivery": {
+ "score": 0.00599454
+ },
+ "EntityTests": {
+ "score": 0.084535785
+ },
+ "Greeting": {
+ "score": 0.005392684
+ },
+ "Help": {
+ "score": 0.005619145
+ },
+ "None": {
+ "score": 0.03300121
+ },
+ "Roles": {
+ "score": 0.0213384479
+ },
+ "search": {
+ "score": 0.000823451439
+ },
+ "SpecifyName": {
+ "score": 0.0037871073
+ },
+ "Travel": {
+ "score": 0.008902215
+ },
+ "Weather_GetForecast": {
+ "score": 0.006632081
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "text": "fly zimbabwe airlines or deltaair",
+ "v3": {
+ "options": {
+ "DynamicLists": [
+ {
+ "listEntityName": "Airline",
+ "requestLists": [
+ {
+ "canonicalForm": "ZimAir",
+ "synonyms": [
+ "zimbabwe airlines"
+ ]
+ },
+ {
+ "canonicalForm": "DeltaAir"
+ }
+ ]
+ }
+ ],
+ "IncludeAllIntents": true,
+ "IncludeAPIResults": true,
+ "IncludeInstanceData": true,
+ "Log": true,
+ "PreferExternalEntities": true,
+ "Slot": "production"
+ },
+ "response": {
+ "prediction": {
+ "entities": {
+ "$instance": {
+ "Airline": [
+ {
+ "length": 17,
+ "modelType": "List Entity Extractor",
+ "modelTypeId": 5,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 4,
+ "text": "zimbabwe airlines",
+ "type": "Airline"
+ },
+ {
+ "length": 8,
+ "modelType": "List Entity Extractor",
+ "modelTypeId": 5,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 25,
+ "text": "deltaair",
+ "type": "Airline"
+ }
+ ],
+ "endloc": [
+ {
+ "length": 8,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "endloc",
+ "startIndex": 4,
+ "text": "zimbabwe",
+ "type": "builtin.geographyV2.countryRegion"
+ }
+ ]
+ },
+ "Airline": [
+ [
+ "ZimAir"
+ ],
+ [
+ "DeltaAir"
+ ]
+ ],
+ "endloc": [
+ {
+ "type": "countryRegion",
+ "value": "zimbabwe"
+ }
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 0.006457624
+ },
+ "Delivery": {
+ "score": 0.00599454
+ },
+ "EntityTests": {
+ "score": 0.084535785
+ },
+ "Greeting": {
+ "score": 0.005392684
+ },
+ "Help": {
+ "score": 0.005619145
+ },
+ "None": {
+ "score": 0.03300121
+ },
+ "Roles": {
+ "score": 0.0213384479
+ },
+ "search": {
+ "score": 0.000823451439
+ },
+ "SpecifyName": {
+ "score": 0.0037871073
+ },
+ "Travel": {
+ "score": 0.008902215
+ },
+ "Weather.GetForecast": {
+ "score": 0.006632081
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "topIntent": "EntityTests"
+ },
+ "query": "fly zimbabwe airlines or deltaair"
+ }
+ }
+}
\ No newline at end of file
diff --git a/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/ExternalEntitiesAndBuiltin.json b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/ExternalEntitiesAndBuiltin.json
new file mode 100644
index 000000000..6ab4b476a
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/ExternalEntitiesAndBuiltin.json
@@ -0,0 +1,167 @@
+{
+ "entities": {
+ "$instance": {
+ "number": [
+ {
+ "endIndex": 7,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "externalEntities"
+ ],
+ "startIndex": 4,
+ "text": "hul",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 13,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 12,
+ "text": "2",
+ "type": "builtin.number"
+ }
+ ]
+ },
+ "number": [
+ 8,
+ 2
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 0.006839604
+ },
+ "Delivery": {
+ "score": 0.005634159
+ },
+ "EntityTests": {
+ "score": 0.1439953
+ },
+ "Greeting": {
+ "score": 0.004496467
+ },
+ "Help": {
+ "score": 0.005810102
+ },
+ "None": {
+ "score": 0.0134399384
+ },
+ "Roles": {
+ "score": 0.0453764722
+ },
+ "search": {
+ "score": 0.00117916975
+ },
+ "SpecifyName": {
+ "score": 0.00377203338
+ },
+ "Travel": {
+ "score": 0.00252068671
+ },
+ "Weather_GetForecast": {
+ "score": 0.009093848
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "text": "buy hul and 2 items",
+ "v3": {
+ "options": {
+ "ExternalEntities": [
+ {
+ "entityLength": 3,
+ "entityName": "number",
+ "resolution": 8,
+ "startIndex": 4
+ }
+ ],
+ "IncludeAllIntents": true,
+ "IncludeAPIResults": true,
+ "IncludeInstanceData": true,
+ "Log": true,
+ "PreferExternalEntities": true,
+ "Slot": "production"
+ },
+ "response": {
+ "prediction": {
+ "entities": {
+ "$instance": {
+ "number": [
+ {
+ "length": 3,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "externalEntities"
+ ],
+ "startIndex": 4,
+ "text": "hul",
+ "type": "builtin.number"
+ },
+ {
+ "length": 1,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 12,
+ "text": "2",
+ "type": "builtin.number"
+ }
+ ]
+ },
+ "number": [
+ 8,
+ 2
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 0.006839604
+ },
+ "Delivery": {
+ "score": 0.005634159
+ },
+ "EntityTests": {
+ "score": 0.1439953
+ },
+ "Greeting": {
+ "score": 0.004496467
+ },
+ "Help": {
+ "score": 0.005810102
+ },
+ "None": {
+ "score": 0.0134399384
+ },
+ "Roles": {
+ "score": 0.0453764722
+ },
+ "search": {
+ "score": 0.00117916975
+ },
+ "SpecifyName": {
+ "score": 0.00377203338
+ },
+ "Travel": {
+ "score": 0.00252068671
+ },
+ "Weather.GetForecast": {
+ "score": 0.009093848
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "topIntent": "EntityTests"
+ },
+ "query": "buy hul and 2 items"
+ }
+ }
+}
\ No newline at end of file
diff --git a/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/ExternalEntitiesAndComposite.json b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/ExternalEntitiesAndComposite.json
new file mode 100644
index 000000000..0b8a7b5c8
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/ExternalEntitiesAndComposite.json
@@ -0,0 +1,196 @@
+{
+ "entities": {
+ "$instance": {
+ "Address": [
+ {
+ "endIndex": 33,
+ "modelType": "Composite Entity Extractor",
+ "recognitionSources": [
+ "externalEntities"
+ ],
+ "startIndex": 17,
+ "text": "repent harelquin",
+ "type": "Address"
+ }
+ ],
+ "number": [
+ {
+ "endIndex": 10,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 8,
+ "text": "35",
+ "type": "builtin.number"
+ }
+ ]
+ },
+ "Address": [
+ {
+ "number": [
+ 3
+ ],
+ "State": [
+ "France"
+ ]
+ }
+ ],
+ "number": [
+ 35
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 0.00324298278
+ },
+ "Delivery": {
+ "score": 0.480763137
+ },
+ "EntityTests": {
+ "score": 0.004284346
+ },
+ "Greeting": {
+ "score": 0.00282274443
+ },
+ "Help": {
+ "score": 0.00290596974
+ },
+ "None": {
+ "score": 0.0205373727
+ },
+ "Roles": {
+ "score": 0.06780239
+ },
+ "search": {
+ "score": 0.000895992853
+ },
+ "SpecifyName": {
+ "score": 0.002745299
+ },
+ "Travel": {
+ "score": 0.00337635027
+ },
+ "Weather_GetForecast": {
+ "score": 0.00949979
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "text": "deliver 35 WA to repent harelquin",
+ "v3": {
+ "options": {
+ "ExternalEntities": [
+ {
+ "entityLength": 16,
+ "entityName": "Address",
+ "resolution": {
+ "number": [
+ 3
+ ],
+ "State": [
+ "France"
+ ]
+ },
+ "startIndex": 17
+ }
+ ],
+ "IncludeAllIntents": true,
+ "IncludeAPIResults": true,
+ "IncludeInstanceData": true,
+ "Log": true,
+ "PreferExternalEntities": true,
+ "Slot": "production"
+ },
+ "response": {
+ "prediction": {
+ "entities": {
+ "$instance": {
+ "Address": [
+ {
+ "length": 16,
+ "modelType": "Composite Entity Extractor",
+ "modelTypeId": 4,
+ "recognitionSources": [
+ "externalEntities"
+ ],
+ "startIndex": 17,
+ "text": "repent harelquin",
+ "type": "Address"
+ }
+ ],
+ "number": [
+ {
+ "length": 2,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 8,
+ "text": "35",
+ "type": "builtin.number"
+ }
+ ]
+ },
+ "Address": [
+ {
+ "number": [
+ 3
+ ],
+ "State": [
+ "France"
+ ]
+ }
+ ],
+ "number": [
+ 35
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 0.00324298278
+ },
+ "Delivery": {
+ "score": 0.480763137
+ },
+ "EntityTests": {
+ "score": 0.004284346
+ },
+ "Greeting": {
+ "score": 0.00282274443
+ },
+ "Help": {
+ "score": 0.00290596974
+ },
+ "None": {
+ "score": 0.0205373727
+ },
+ "Roles": {
+ "score": 0.06780239
+ },
+ "search": {
+ "score": 0.000895992853
+ },
+ "SpecifyName": {
+ "score": 0.002745299
+ },
+ "Travel": {
+ "score": 0.00337635027
+ },
+ "Weather.GetForecast": {
+ "score": 0.00949979
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "topIntent": "Delivery"
+ },
+ "query": "deliver 35 WA to repent harelquin"
+ }
+ }
+}
\ No newline at end of file
diff --git a/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/ExternalEntitiesAndList.json b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/ExternalEntitiesAndList.json
new file mode 100644
index 000000000..c4e88f12b
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/ExternalEntitiesAndList.json
@@ -0,0 +1,177 @@
+{
+ "entities": {
+ "$instance": {
+ "Airline": [
+ {
+ "endIndex": 23,
+ "modelType": "List Entity Extractor",
+ "recognitionSources": [
+ "externalEntities"
+ ],
+ "startIndex": 7,
+ "text": "humberg airlines",
+ "type": "Airline"
+ },
+ {
+ "endIndex": 32,
+ "modelType": "List Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 27,
+ "text": "Delta",
+ "type": "Airline"
+ }
+ ]
+ },
+ "Airline": [
+ [
+ "HumAir"
+ ],
+ [
+ "Delta"
+ ]
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 0.00322572654
+ },
+ "Delivery": {
+ "score": 0.00437863264
+ },
+ "EntityTests": {
+ "score": 0.07901226
+ },
+ "Greeting": {
+ "score": 0.00273721316
+ },
+ "Help": {
+ "score": 0.00294000562
+ },
+ "None": {
+ "score": 0.0279089436
+ },
+ "Roles": {
+ "score": 0.120735578
+ },
+ "search": {
+ "score": 0.000854549464
+ },
+ "SpecifyName": {
+ "score": 0.002717544
+ },
+ "Travel": {
+ "score": 0.00884681847
+ },
+ "Weather_GetForecast": {
+ "score": 0.00485026464
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "text": "fly on humberg airlines or Delta",
+ "v3": {
+ "options": {
+ "ExternalEntities": [
+ {
+ "entityLength": 16,
+ "entityName": "Airline",
+ "resolution": [
+ "HumAir"
+ ],
+ "startIndex": 7
+ }
+ ],
+ "IncludeAllIntents": true,
+ "IncludeAPIResults": true,
+ "IncludeInstanceData": true,
+ "Log": true,
+ "PreferExternalEntities": true,
+ "Slot": "production"
+ },
+ "response": {
+ "prediction": {
+ "entities": {
+ "$instance": {
+ "Airline": [
+ {
+ "length": 16,
+ "modelType": "List Entity Extractor",
+ "modelTypeId": 5,
+ "recognitionSources": [
+ "externalEntities"
+ ],
+ "startIndex": 7,
+ "text": "humberg airlines",
+ "type": "Airline"
+ },
+ {
+ "length": 5,
+ "modelType": "List Entity Extractor",
+ "modelTypeId": 5,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 27,
+ "text": "Delta",
+ "type": "Airline"
+ }
+ ]
+ },
+ "Airline": [
+ [
+ "HumAir"
+ ],
+ [
+ "Delta"
+ ]
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 0.00322572654
+ },
+ "Delivery": {
+ "score": 0.00437863264
+ },
+ "EntityTests": {
+ "score": 0.07901226
+ },
+ "Greeting": {
+ "score": 0.00273721316
+ },
+ "Help": {
+ "score": 0.00294000562
+ },
+ "None": {
+ "score": 0.0279089436
+ },
+ "Roles": {
+ "score": 0.120735578
+ },
+ "search": {
+ "score": 0.000854549464
+ },
+ "SpecifyName": {
+ "score": 0.002717544
+ },
+ "Travel": {
+ "score": 0.00884681847
+ },
+ "Weather.GetForecast": {
+ "score": 0.00485026464
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "topIntent": "Roles"
+ },
+ "query": "fly on humberg airlines or Delta"
+ }
+ }
+}
\ No newline at end of file
diff --git a/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/ExternalEntitiesAndRegex.json b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/ExternalEntitiesAndRegex.json
new file mode 100644
index 000000000..33b9fef97
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/ExternalEntitiesAndRegex.json
@@ -0,0 +1,166 @@
+{
+ "entities": {
+ "$instance": {
+ "Part": [
+ {
+ "endIndex": 5,
+ "modelType": "Regex Entity Extractor",
+ "recognitionSources": [
+ "externalEntities"
+ ],
+ "startIndex": 0,
+ "text": "42ski",
+ "type": "Part"
+ },
+ {
+ "endIndex": 26,
+ "modelType": "Regex Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 21,
+ "text": "kb423",
+ "type": "Part"
+ }
+ ]
+ },
+ "Part": [
+ "42ski",
+ "kb423"
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 0.0128021352
+ },
+ "Delivery": {
+ "score": 0.004558195
+ },
+ "EntityTests": {
+ "score": 0.009367461
+ },
+ "Greeting": {
+ "score": 0.0025622393
+ },
+ "Help": {
+ "score": 0.0021368505
+ },
+ "None": {
+ "score": 0.2778768
+ },
+ "Roles": {
+ "score": 0.0273504611
+ },
+ "search": {
+ "score": 0.000832980848
+ },
+ "SpecifyName": {
+ "score": 0.00770643726
+ },
+ "Travel": {
+ "score": 0.00204822514
+ },
+ "Weather_GetForecast": {
+ "score": 0.009585343
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "text": "42ski is a part like kb423",
+ "v3": {
+ "options": {
+ "ExternalEntities": [
+ {
+ "entityLength": 5,
+ "entityName": "Part",
+ "startIndex": 0
+ }
+ ],
+ "IncludeAllIntents": true,
+ "IncludeAPIResults": true,
+ "IncludeInstanceData": true,
+ "Log": true,
+ "PreferExternalEntities": true,
+ "Slot": "production"
+ },
+ "response": {
+ "prediction": {
+ "entities": {
+ "$instance": {
+ "Part": [
+ {
+ "length": 5,
+ "modelType": "Regex Entity Extractor",
+ "modelTypeId": 8,
+ "recognitionSources": [
+ "externalEntities"
+ ],
+ "startIndex": 0,
+ "text": "42ski",
+ "type": "Part"
+ },
+ {
+ "length": 5,
+ "modelType": "Regex Entity Extractor",
+ "modelTypeId": 8,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 21,
+ "text": "kb423",
+ "type": "Part"
+ }
+ ]
+ },
+ "Part": [
+ "42ski",
+ "kb423"
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 0.0128021352
+ },
+ "Delivery": {
+ "score": 0.004558195
+ },
+ "EntityTests": {
+ "score": 0.009367461
+ },
+ "Greeting": {
+ "score": 0.0025622393
+ },
+ "Help": {
+ "score": 0.0021368505
+ },
+ "None": {
+ "score": 0.2778768
+ },
+ "Roles": {
+ "score": 0.0273504611
+ },
+ "search": {
+ "score": 0.000832980848
+ },
+ "SpecifyName": {
+ "score": 0.00770643726
+ },
+ "Travel": {
+ "score": 0.00204822514
+ },
+ "Weather.GetForecast": {
+ "score": 0.009585343
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "topIntent": "None"
+ },
+ "query": "42ski is a part like kb423"
+ }
+ }
+}
\ No newline at end of file
diff --git a/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/ExternalEntitiesAndSimple.json b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/ExternalEntitiesAndSimple.json
new file mode 100644
index 000000000..7fc6b25c0
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/ExternalEntitiesAndSimple.json
@@ -0,0 +1,232 @@
+{
+ "entities": {
+ "$instance": {
+ "number": [
+ {
+ "endIndex": 10,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 8,
+ "text": "37",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 19,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 17,
+ "text": "82",
+ "type": "builtin.number"
+ }
+ ],
+ "State": [
+ {
+ "endIndex": 13,
+ "modelType": "Entity Extractor",
+ "recognitionSources": [
+ "externalEntities"
+ ],
+ "startIndex": 11,
+ "text": "wa",
+ "type": "State"
+ },
+ {
+ "endIndex": 22,
+ "modelType": "Entity Extractor",
+ "recognitionSources": [
+ "externalEntities"
+ ],
+ "startIndex": 20,
+ "text": "co",
+ "type": "State"
+ }
+ ]
+ },
+ "number": [
+ 37,
+ 82
+ ],
+ "State": [
+ "wa",
+ {
+ "state": "Colorado"
+ }
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 0.004019331
+ },
+ "Delivery": {
+ "score": 0.509761333
+ },
+ "EntityTests": {
+ "score": 0.004867602
+ },
+ "Greeting": {
+ "score": 0.002855288
+ },
+ "Help": {
+ "score": 0.00350000733
+ },
+ "None": {
+ "score": 0.0121234478
+ },
+ "Roles": {
+ "score": 0.08292572
+ },
+ "search": {
+ "score": 0.0009203224
+ },
+ "SpecifyName": {
+ "score": 0.00308484654
+ },
+ "Travel": {
+ "score": 0.00362442387
+ },
+ "Weather_GetForecast": {
+ "score": 0.01115346
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "text": "deliver 37 wa to 82 co",
+ "v3": {
+ "options": {
+ "ExternalEntities": [
+ {
+ "entityLength": 2,
+ "entityName": "State",
+ "startIndex": 11
+ },
+ {
+ "entityLength": 2,
+ "entityName": "State",
+ "resolution": {
+ "state": "Colorado"
+ },
+ "startIndex": 20
+ }
+ ],
+ "IncludeAllIntents": true,
+ "IncludeAPIResults": true,
+ "IncludeInstanceData": true,
+ "Log": true,
+ "PreferExternalEntities": true,
+ "Slot": "production"
+ },
+ "response": {
+ "prediction": {
+ "entities": {
+ "$instance": {
+ "number": [
+ {
+ "length": 2,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 8,
+ "text": "37",
+ "type": "builtin.number"
+ },
+ {
+ "length": 2,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 17,
+ "text": "82",
+ "type": "builtin.number"
+ }
+ ],
+ "State": [
+ {
+ "length": 2,
+ "modelType": "Entity Extractor",
+ "modelTypeId": 1,
+ "recognitionSources": [
+ "externalEntities"
+ ],
+ "startIndex": 11,
+ "text": "wa",
+ "type": "State"
+ },
+ {
+ "length": 2,
+ "modelType": "Entity Extractor",
+ "modelTypeId": 1,
+ "recognitionSources": [
+ "externalEntities"
+ ],
+ "startIndex": 20,
+ "text": "co",
+ "type": "State"
+ }
+ ]
+ },
+ "number": [
+ 37,
+ 82
+ ],
+ "State": [
+ "wa",
+ {
+ "state": "Colorado"
+ }
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 0.004019331
+ },
+ "Delivery": {
+ "score": 0.509761333
+ },
+ "EntityTests": {
+ "score": 0.004867602
+ },
+ "Greeting": {
+ "score": 0.002855288
+ },
+ "Help": {
+ "score": 0.00350000733
+ },
+ "None": {
+ "score": 0.0121234478
+ },
+ "Roles": {
+ "score": 0.08292572
+ },
+ "search": {
+ "score": 0.0009203224
+ },
+ "SpecifyName": {
+ "score": 0.00308484654
+ },
+ "Travel": {
+ "score": 0.00362442387
+ },
+ "Weather.GetForecast": {
+ "score": 0.01115346
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "topIntent": "Delivery"
+ },
+ "query": "deliver 37 wa to 82 co"
+ }
+ }
+}
\ No newline at end of file
diff --git a/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/ExternalEntitiesAndSimpleOverride.json b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/ExternalEntitiesAndSimpleOverride.json
new file mode 100644
index 000000000..5f2080c8d
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/ExternalEntitiesAndSimpleOverride.json
@@ -0,0 +1,239 @@
+{
+ "entities": {
+ "$instance": {
+ "number": [
+ {
+ "endIndex": 10,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 8,
+ "text": "37",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 19,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 17,
+ "text": "82",
+ "type": "builtin.number"
+ }
+ ],
+ "State": [
+ {
+ "endIndex": 13,
+ "modelType": "Entity Extractor",
+ "recognitionSources": [
+ "externalEntities"
+ ],
+ "startIndex": 11,
+ "text": "wa",
+ "type": "State"
+ },
+ {
+ "endIndex": 22,
+ "modelType": "Entity Extractor",
+ "recognitionSources": [
+ "externalEntities"
+ ],
+ "startIndex": 20,
+ "text": "co",
+ "type": "State"
+ }
+ ]
+ },
+ "number": [
+ 37,
+ 82
+ ],
+ "State": [
+ {
+ "state": "Washington"
+ },
+ {
+ "state": "Colorado"
+ }
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 0.004019331
+ },
+ "Delivery": {
+ "score": 0.509761333
+ },
+ "EntityTests": {
+ "score": 0.004867602
+ },
+ "Greeting": {
+ "score": 0.002855288
+ },
+ "Help": {
+ "score": 0.00350000733
+ },
+ "None": {
+ "score": 0.0121234478
+ },
+ "Roles": {
+ "score": 0.08292572
+ },
+ "search": {
+ "score": 0.0009203224
+ },
+ "SpecifyName": {
+ "score": 0.00308484654
+ },
+ "Travel": {
+ "score": 0.00362442387
+ },
+ "Weather_GetForecast": {
+ "score": 0.01115346
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "text": "deliver 37 wa to 82 co",
+ "v3": {
+ "options": {
+ "ExternalEntities": [
+ {
+ "entityLength": 2,
+ "entityName": "State",
+ "resolution": {
+ "state": "Washington"
+ },
+ "startIndex": 11
+ },
+ {
+ "entityLength": 2,
+ "entityName": "State",
+ "resolution": {
+ "state": "Colorado"
+ },
+ "startIndex": 20
+ }
+ ],
+ "IncludeAllIntents": true,
+ "IncludeAPIResults": true,
+ "IncludeInstanceData": true,
+ "Log": true,
+ "PreferExternalEntities": true,
+ "Slot": "production"
+ },
+ "response": {
+ "prediction": {
+ "entities": {
+ "$instance": {
+ "number": [
+ {
+ "length": 2,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 8,
+ "text": "37",
+ "type": "builtin.number"
+ },
+ {
+ "length": 2,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 17,
+ "text": "82",
+ "type": "builtin.number"
+ }
+ ],
+ "State": [
+ {
+ "length": 2,
+ "modelType": "Entity Extractor",
+ "modelTypeId": 1,
+ "recognitionSources": [
+ "externalEntities"
+ ],
+ "startIndex": 11,
+ "text": "wa",
+ "type": "State"
+ },
+ {
+ "length": 2,
+ "modelType": "Entity Extractor",
+ "modelTypeId": 1,
+ "recognitionSources": [
+ "externalEntities"
+ ],
+ "startIndex": 20,
+ "text": "co",
+ "type": "State"
+ }
+ ]
+ },
+ "number": [
+ 37,
+ 82
+ ],
+ "State": [
+ {
+ "state": "Washington"
+ },
+ {
+ "state": "Colorado"
+ }
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 0.004019331
+ },
+ "Delivery": {
+ "score": 0.509761333
+ },
+ "EntityTests": {
+ "score": 0.004867602
+ },
+ "Greeting": {
+ "score": 0.002855288
+ },
+ "Help": {
+ "score": 0.00350000733
+ },
+ "None": {
+ "score": 0.0121234478
+ },
+ "Roles": {
+ "score": 0.08292572
+ },
+ "search": {
+ "score": 0.0009203224
+ },
+ "SpecifyName": {
+ "score": 0.00308484654
+ },
+ "Travel": {
+ "score": 0.00362442387
+ },
+ "Weather.GetForecast": {
+ "score": 0.01115346
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "topIntent": "Delivery"
+ },
+ "query": "deliver 37 wa to 82 co"
+ }
+ }
+}
\ No newline at end of file
diff --git a/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/ExternalRecognizer.json b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/ExternalRecognizer.json
new file mode 100644
index 000000000..05cca17b7
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/ExternalRecognizer.json
@@ -0,0 +1,201 @@
+{
+ "entities": {
+ "$instance": {
+ "Address": [
+ {
+ "endIndex": 33,
+ "modelType": "Composite Entity Extractor",
+ "recognitionSources": [
+ "externalEntities"
+ ],
+ "startIndex": 17,
+ "text": "repent harelquin",
+ "type": "Address"
+ }
+ ],
+ "number": [
+ {
+ "endIndex": 10,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 8,
+ "text": "35",
+ "type": "builtin.number"
+ }
+ ]
+ },
+ "Address": [
+ {
+ "number": [
+ 3
+ ],
+ "State": [
+ "France"
+ ]
+ }
+ ],
+ "number": [
+ 35
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 0.00324298278
+ },
+ "Delivery": {
+ "score": 0.480763137
+ },
+ "EntityTests": {
+ "score": 0.004284346
+ },
+ "Greeting": {
+ "score": 0.00282274443
+ },
+ "Help": {
+ "score": 0.00290596974
+ },
+ "None": {
+ "score": 0.0205373727
+ },
+ "Roles": {
+ "score": 0.06780239
+ },
+ "search": {
+ "score": 0.000895992853
+ },
+ "SpecifyName": {
+ "score": 0.002745299
+ },
+ "Travel": {
+ "score": 0.00337635027
+ },
+ "Weather_GetForecast": {
+ "score": 0.00949979
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "text": "deliver 35 WA to repent harelquin",
+ "v3": {
+ "options": {
+ "ExternalRecognizerResult": {
+ "$instance":{
+ "Address":[
+ {
+ "endIndex":33,
+ "modelType":"Composite Entity Extractor",
+ "resolution": {
+ "number": [
+ 3
+ ],
+ "State": [
+ "France"
+ ]},
+ "startIndex":17,
+ "text":"repent harelquin",
+ "type":"Address"
+ }
+ ]
+ }
+ },
+ "IncludeAllIntents": true,
+ "IncludeAPIResults": true,
+ "IncludeInstanceData": true,
+ "Log": true,
+ "PreferExternalEntities": true,
+ "Slot": "production"
+ },
+ "response": {
+ "prediction": {
+ "entities": {
+ "$instance": {
+ "Address": [
+ {
+ "length": 16,
+ "modelType": "Composite Entity Extractor",
+ "modelTypeId": 4,
+ "recognitionSources": [
+ "externalEntities"
+ ],
+ "startIndex": 17,
+ "text": "repent harelquin",
+ "type": "Address"
+ }
+ ],
+ "number": [
+ {
+ "length": 2,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 8,
+ "text": "35",
+ "type": "builtin.number"
+ }
+ ]
+ },
+ "Address": [
+ {
+ "number": [
+ 3
+ ],
+ "State": [
+ "France"
+ ]
+ }
+ ],
+ "number": [
+ 35
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 0.00324298278
+ },
+ "Delivery": {
+ "score": 0.480763137
+ },
+ "EntityTests": {
+ "score": 0.004284346
+ },
+ "Greeting": {
+ "score": 0.00282274443
+ },
+ "Help": {
+ "score": 0.00290596974
+ },
+ "None": {
+ "score": 0.0205373727
+ },
+ "Roles": {
+ "score": 0.06780239
+ },
+ "search": {
+ "score": 0.000895992853
+ },
+ "SpecifyName": {
+ "score": 0.002745299
+ },
+ "Travel": {
+ "score": 0.00337635027
+ },
+ "Weather.GetForecast": {
+ "score": 0.00949979
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "topIntent": "Delivery"
+ },
+ "query": "deliver 35 WA to repent harelquin"
+ }
+ }
+}
diff --git a/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/GeoPeopleOrdinal.json b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/GeoPeopleOrdinal.json
new file mode 100644
index 000000000..758c2efb5
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/GeoPeopleOrdinal.json
@@ -0,0 +1,436 @@
+{
+ "entities": {
+ "$instance": {
+ "child": [
+ {
+ "endIndex": 99,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 87,
+ "text": "lisa simpson",
+ "type": "builtin.personName"
+ }
+ ],
+ "endloc": [
+ {
+ "endIndex": 51,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 44,
+ "text": "jakarta",
+ "type": "builtin.geographyV2.city"
+ }
+ ],
+ "ordinalV2": [
+ {
+ "endIndex": 28,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 24,
+ "text": "last",
+ "type": "builtin.ordinalV2.relative"
+ }
+ ],
+ "parent": [
+ {
+ "endIndex": 69,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 56,
+ "text": "homer simpson",
+ "type": "builtin.personName"
+ }
+ ],
+ "startloc": [
+ {
+ "endIndex": 40,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 34,
+ "text": "london",
+ "type": "builtin.geographyV2.city"
+ }
+ ],
+ "startpos": [
+ {
+ "endIndex": 20,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 8,
+ "text": "next to last",
+ "type": "builtin.ordinalV2.relative"
+ }
+ ]
+ },
+ "child": [
+ "lisa simpson"
+ ],
+ "endloc": [
+ {
+ "location": "jakarta",
+ "type": "city"
+ }
+ ],
+ "ordinalV2": [
+ {
+ "offset": 0,
+ "relativeTo": "end"
+ }
+ ],
+ "parent": [
+ "homer simpson"
+ ],
+ "startloc": [
+ {
+ "location": "london",
+ "type": "city"
+ }
+ ],
+ "startpos": [
+ {
+ "offset": -1,
+ "relativeTo": "end"
+ }
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 0.000106304564
+ },
+ "Delivery": {
+ "score": 0.00121616619
+ },
+ "EntityTests": {
+ "score": 0.00107762846
+ },
+ "Greeting": {
+ "score": 5.23392373E-05
+ },
+ "Help": {
+ "score": 0.000134394242
+ },
+ "None": {
+ "score": 0.0108486973
+ },
+ "Roles": {
+ "score": 0.9991838
+ },
+ "search": {
+ "score": 0.002142746
+ },
+ "SpecifyName": {
+ "score": 0.0006965211
+ },
+ "Travel": {
+ "score": 0.0046763327
+ },
+ "Weather_GetForecast": {
+ "score": 0.0105504664
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "text": "go from next to last to last move london to jakarta and homer simpson is the parent of lisa simpson",
+ "v2": {
+ "options": {
+ "IncludeAllIntents": true,
+ "IncludeInstanceData": true,
+ "LogPersonalInformation": false,
+ "Timeout": 100000.0
+ },
+ "response": {
+ "entities": [
+ {
+ "endIndex": 39,
+ "entity": "london",
+ "role": "startloc",
+ "startIndex": 34,
+ "type": "builtin.geographyV2.city"
+ },
+ {
+ "endIndex": 50,
+ "entity": "jakarta",
+ "role": "endloc",
+ "startIndex": 44,
+ "type": "builtin.geographyV2.city"
+ },
+ {
+ "endIndex": 19,
+ "entity": "next to last",
+ "resolution": {
+ "offset": "-1",
+ "relativeTo": "end"
+ },
+ "role": "startpos",
+ "startIndex": 8,
+ "type": "builtin.ordinalV2.relative"
+ },
+ {
+ "endIndex": 27,
+ "entity": "last",
+ "resolution": {
+ "offset": "0",
+ "relativeTo": "end"
+ },
+ "startIndex": 24,
+ "type": "builtin.ordinalV2.relative"
+ },
+ {
+ "endIndex": 68,
+ "entity": "homer simpson",
+ "role": "parent",
+ "startIndex": 56,
+ "type": "builtin.personName"
+ },
+ {
+ "endIndex": 98,
+ "entity": "lisa simpson",
+ "role": "child",
+ "startIndex": 87,
+ "type": "builtin.personName"
+ }
+ ],
+ "intents": [
+ {
+ "intent": "Roles",
+ "score": 0.9991838
+ },
+ {
+ "intent": "None",
+ "score": 0.0108486973
+ },
+ {
+ "intent": "Weather.GetForecast",
+ "score": 0.0105504664
+ },
+ {
+ "intent": "Travel",
+ "score": 0.0046763327
+ },
+ {
+ "intent": "search",
+ "score": 0.002142746
+ },
+ {
+ "intent": "Delivery",
+ "score": 0.00121616619
+ },
+ {
+ "intent": "EntityTests",
+ "score": 0.00107762846
+ },
+ {
+ "intent": "SpecifyName",
+ "score": 0.0006965211
+ },
+ {
+ "intent": "Help",
+ "score": 0.000134394242
+ },
+ {
+ "intent": "Cancel",
+ "score": 0.000106304564
+ },
+ {
+ "intent": "Greeting",
+ "score": 5.23392373E-05
+ }
+ ],
+ "query": "go from next to last to last move london to jakarta and homer simpson is the parent of lisa simpson",
+ "sentimentAnalysis": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "topScoringIntent": {
+ "intent": "Roles",
+ "score": 0.9991838
+ }
+ }
+ },
+ "v3": {
+ "options": {
+ "IncludeAllIntents": true,
+ "IncludeAPIResults": true,
+ "IncludeInstanceData": true,
+ "Log": true,
+ "PreferExternalEntities": true,
+ "Slot": "production"
+ },
+ "response": {
+ "prediction": {
+ "entities": {
+ "$instance": {
+ "child": [
+ {
+ "length": 12,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "child",
+ "startIndex": 87,
+ "text": "lisa simpson",
+ "type": "builtin.personName"
+ }
+ ],
+ "endloc": [
+ {
+ "length": 7,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "endloc",
+ "startIndex": 44,
+ "text": "jakarta",
+ "type": "builtin.geographyV2.city"
+ }
+ ],
+ "ordinalV2": [
+ {
+ "length": 4,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 24,
+ "text": "last",
+ "type": "builtin.ordinalV2.relative"
+ }
+ ],
+ "parent": [
+ {
+ "length": 13,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "parent",
+ "startIndex": 56,
+ "text": "homer simpson",
+ "type": "builtin.personName"
+ }
+ ],
+ "startloc": [
+ {
+ "length": 6,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "startloc",
+ "startIndex": 34,
+ "text": "london",
+ "type": "builtin.geographyV2.city"
+ }
+ ],
+ "startpos": [
+ {
+ "length": 12,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "startpos",
+ "startIndex": 8,
+ "text": "next to last",
+ "type": "builtin.ordinalV2.relative"
+ }
+ ]
+ },
+ "child": [
+ "lisa simpson"
+ ],
+ "endloc": [
+ {
+ "type": "city",
+ "value": "jakarta"
+ }
+ ],
+ "ordinalV2": [
+ {
+ "offset": 0,
+ "relativeTo": "end"
+ }
+ ],
+ "parent": [
+ "homer simpson"
+ ],
+ "startloc": [
+ {
+ "type": "city",
+ "value": "london"
+ }
+ ],
+ "startpos": [
+ {
+ "offset": -1,
+ "relativeTo": "end"
+ }
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 0.000106304564
+ },
+ "Delivery": {
+ "score": 0.00121616619
+ },
+ "EntityTests": {
+ "score": 0.00107762846
+ },
+ "Greeting": {
+ "score": 5.23392373E-05
+ },
+ "Help": {
+ "score": 0.000134394242
+ },
+ "None": {
+ "score": 0.0108486973
+ },
+ "Roles": {
+ "score": 0.9991838
+ },
+ "search": {
+ "score": 0.002142746
+ },
+ "SpecifyName": {
+ "score": 0.0006965211
+ },
+ "Travel": {
+ "score": 0.0046763327
+ },
+ "Weather.GetForecast": {
+ "score": 0.0105504664
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "topIntent": "Roles"
+ },
+ "query": "go from next to last to last move london to jakarta and homer simpson is the parent of lisa simpson"
+ }
+ }
+}
\ No newline at end of file
diff --git a/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/Minimal.json b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/Minimal.json
new file mode 100644
index 000000000..62a0bb45e
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/Minimal.json
@@ -0,0 +1,143 @@
+{
+ "entities": {
+ "Airline": [
+ [
+ "Delta"
+ ]
+ ],
+ "datetime": [
+ {
+ "timex": [
+ "T15"
+ ],
+ "type": "time"
+ }
+ ],
+ "dimension": [
+ {
+ "number": 3,
+ "units": "Picometer"
+ }
+ ]
+ },
+ "intents": {
+ "Roles": {
+ "score": 0.42429316
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "text": "fly on delta at 3pm",
+ "v2": {
+ "options": {
+ "IncludeAllIntents": false,
+ "IncludeInstanceData": false,
+ "LogPersonalInformation": false,
+ "Timeout": 100000.0
+ },
+ "response": {
+ "entities": [
+ {
+ "endIndex": 18,
+ "entity": "3pm",
+ "resolution": {
+ "values": [
+ {
+ "timex": "T15",
+ "type": "time",
+ "value": "15:00:00"
+ }
+ ]
+ },
+ "startIndex": 16,
+ "type": "builtin.datetimeV2.time"
+ },
+ {
+ "endIndex": 18,
+ "entity": "3pm",
+ "resolution": {
+ "unit": "Picometer",
+ "value": "3"
+ },
+ "startIndex": 16,
+ "type": "builtin.dimension"
+ },
+ {
+ "endIndex": 11,
+ "entity": "delta",
+ "resolution": {
+ "values": [
+ "Delta"
+ ]
+ },
+ "startIndex": 7,
+ "type": "Airline"
+ }
+ ],
+ "query": "fly on delta at 3pm",
+ "sentimentAnalysis": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "topScoringIntent": {
+ "intent": "Roles",
+ "score": 0.42429316
+ }
+ }
+ },
+ "v3": {
+ "options": {
+ "IncludeAllIntents": false,
+ "IncludeAPIResults": true,
+ "IncludeInstanceData": false,
+ "Log": true,
+ "PreferExternalEntities": true,
+ "Slot": "production"
+ },
+ "response": {
+ "prediction": {
+ "entities": {
+ "Airline": [
+ [
+ "Delta"
+ ]
+ ],
+ "datetimeV2": [
+ {
+ "type": "time",
+ "values": [
+ {
+ "resolution": [
+ {
+ "value": "15:00:00"
+ }
+ ],
+ "timex": "T15"
+ }
+ ]
+ }
+ ],
+ "dimension": [
+ {
+ "number": 3,
+ "units": "Picometer"
+ }
+ ]
+ },
+ "intents": {
+ "Roles": {
+ "score": 0.42429316
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "topIntent": "Roles"
+ },
+ "query": "fly on delta at 3pm"
+ }
+ }
+}
\ No newline at end of file
diff --git a/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/MinimalWithGeo.json b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/MinimalWithGeo.json
new file mode 100644
index 000000000..bd02086e1
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/MinimalWithGeo.json
@@ -0,0 +1,672 @@
+{
+ "entities": {
+ "geographyV2": [
+ {
+ "location": "dallas",
+ "type": "city"
+ },
+ {
+ "location": "texas",
+ "type": "state"
+ }
+ ]
+ },
+ "intents": {
+ "EntityTests": {
+ "score": 0.466911465
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "text": "fly to dallas, texas",
+ "v2": {
+ "options": {
+ "IncludeAllIntents": false,
+ "IncludeInstanceData": false,
+ "LogPersonalInformation": false,
+ "Timeout": 100000.0
+ },
+ "response": {
+ "entities": [
+ {
+ "endIndex": 12,
+ "entity": "dallas",
+ "startIndex": 7,
+ "type": "builtin.geographyV2.city"
+ },
+ {
+ "endIndex": 19,
+ "entity": "texas",
+ "startIndex": 15,
+ "type": "builtin.geographyV2.state"
+ }
+ ],
+ "query": "fly to dallas, texas",
+ "sentimentAnalysis": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "topScoringIntent": {
+ "intent": "EntityTests",
+ "score": 0.466911465
+ }
+ }
+ },
+ "v3": {
+ "options": {
+ "IncludeAllIntents": false,
+ "IncludeInstanceData": false,
+ "LogPersonalInformation": false,
+ "Slot": "production",
+ "Timeout": 100000.0
+ },
+ "response": {
+ "prediction": {
+ "entities": {
+ "Composite1": [
+ {
+ "$instance": {
+ "age": [
+ {
+ "length": 12,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 0,
+ "text": "12 years old",
+ "type": "builtin.age"
+ },
+ {
+ "length": 10,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 17,
+ "text": "3 days old",
+ "type": "builtin.age"
+ }
+ ],
+ "datetimeV2": [
+ {
+ "length": 8,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 0,
+ "text": "12 years",
+ "type": "builtin.datetimeV2.duration"
+ },
+ {
+ "length": 6,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 17,
+ "text": "3 days",
+ "type": "builtin.datetimeV2.duration"
+ },
+ {
+ "length": 21,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 32,
+ "text": "monday july 3rd, 2019",
+ "type": "builtin.datetimeV2.date"
+ },
+ {
+ "length": 12,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 58,
+ "text": "every monday",
+ "type": "builtin.datetimeV2.set"
+ },
+ {
+ "length": 22,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 75,
+ "text": "between 3am and 5:30am",
+ "type": "builtin.datetimeV2.timerange"
+ }
+ ],
+ "dimension": [
+ {
+ "length": 7,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 102,
+ "text": "4 acres",
+ "type": "builtin.dimension"
+ },
+ {
+ "length": 13,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 114,
+ "text": "4 pico meters",
+ "type": "builtin.dimension"
+ }
+ ],
+ "email": [
+ {
+ "length": 18,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 132,
+ "text": "chrimc@hotmail.com",
+ "type": "builtin.email"
+ }
+ ],
+ "money": [
+ {
+ "length": 2,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 155,
+ "text": "$4",
+ "type": "builtin.currency"
+ },
+ {
+ "length": 5,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 162,
+ "text": "$4.25",
+ "type": "builtin.currency"
+ }
+ ],
+ "number": [
+ {
+ "length": 2,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 0,
+ "text": "12",
+ "type": "builtin.number"
+ },
+ {
+ "length": 1,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 17,
+ "text": "3",
+ "type": "builtin.number"
+ },
+ {
+ "length": 4,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 49,
+ "text": "2019",
+ "type": "builtin.number"
+ },
+ {
+ "length": 1,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 91,
+ "text": "5",
+ "type": "builtin.number"
+ },
+ {
+ "length": 1,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 102,
+ "text": "4",
+ "type": "builtin.number"
+ },
+ {
+ "length": 1,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 114,
+ "text": "4",
+ "type": "builtin.number"
+ },
+ {
+ "length": 1,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 156,
+ "text": "4",
+ "type": "builtin.number"
+ },
+ {
+ "length": 4,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 163,
+ "text": "4.25",
+ "type": "builtin.number"
+ },
+ {
+ "length": 2,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 177,
+ "text": "32",
+ "type": "builtin.number"
+ },
+ {
+ "length": 5,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 184,
+ "text": "210.4",
+ "type": "builtin.number"
+ },
+ {
+ "length": 2,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 204,
+ "text": "10",
+ "type": "builtin.number"
+ },
+ {
+ "length": 4,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 212,
+ "text": "10.5",
+ "type": "builtin.number"
+ },
+ {
+ "length": 3,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 222,
+ "text": "425",
+ "type": "builtin.number"
+ },
+ {
+ "length": 3,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 226,
+ "text": "555",
+ "type": "builtin.number"
+ },
+ {
+ "length": 4,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 230,
+ "text": "1234",
+ "type": "builtin.number"
+ },
+ {
+ "length": 1,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 239,
+ "text": "3",
+ "type": "builtin.number"
+ },
+ {
+ "length": 5,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 253,
+ "text": "-27.5",
+ "type": "builtin.number"
+ },
+ {
+ "length": 3,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 282,
+ "text": "one",
+ "type": "builtin.number"
+ },
+ {
+ "length": 3,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 303,
+ "text": "one",
+ "type": "builtin.number"
+ }
+ ],
+ "percentage": [
+ {
+ "length": 3,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 204,
+ "text": "10%",
+ "type": "builtin.percentage"
+ },
+ {
+ "length": 5,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 212,
+ "text": "10.5%",
+ "type": "builtin.percentage"
+ }
+ ],
+ "phonenumber": [
+ {
+ "length": 12,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "score": 0.9,
+ "startIndex": 222,
+ "text": "425-555-1234",
+ "type": "builtin.phonenumber"
+ }
+ ],
+ "temperature": [
+ {
+ "length": 9,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 239,
+ "text": "3 degrees",
+ "type": "builtin.temperature"
+ },
+ {
+ "length": 15,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 253,
+ "text": "-27.5 degrees c",
+ "type": "builtin.temperature"
+ }
+ ]
+ },
+ "age": [
+ {
+ "number": 12,
+ "unit": "Year"
+ },
+ {
+ "number": 3,
+ "unit": "Day"
+ }
+ ],
+ "datetimeV2": [
+ {
+ "type": "duration",
+ "values": [
+ {
+ "timex": "P12Y",
+ "value": "378432000"
+ }
+ ]
+ },
+ {
+ "type": "duration",
+ "values": [
+ {
+ "timex": "P3D",
+ "value": "259200"
+ }
+ ]
+ },
+ {
+ "type": "date",
+ "values": [
+ {
+ "timex": "2019-07-03",
+ "value": "2019-07-03"
+ }
+ ]
+ },
+ {
+ "type": "set",
+ "values": [
+ {
+ "timex": "XXXX-WXX-1",
+ "value": "not resolved"
+ }
+ ]
+ },
+ {
+ "type": "timerange",
+ "values": [
+ {
+ "end": "05:30:00",
+ "start": "03:00:00",
+ "timex": "(T03,T05:30,PT2H30M)"
+ }
+ ]
+ }
+ ],
+ "dimension": [
+ {
+ "number": 4,
+ "unit": "Acre"
+ },
+ {
+ "number": 4,
+ "unit": "Picometer"
+ }
+ ],
+ "email": [
+ "chrimc@hotmail.com"
+ ],
+ "money": [
+ {
+ "number": 4,
+ "unit": "Dollar"
+ },
+ {
+ "number": 4.25,
+ "unit": "Dollar"
+ }
+ ],
+ "number": [
+ 12,
+ 3,
+ 2019,
+ 5,
+ 4,
+ 4,
+ 4,
+ 4.25,
+ 32,
+ 210.4,
+ 10,
+ 10.5,
+ 425,
+ 555,
+ 1234,
+ 3,
+ -27.5,
+ 1,
+ 1
+ ],
+ "percentage": [
+ 10,
+ 10.5
+ ],
+ "phonenumber": [
+ "425-555-1234"
+ ],
+ "temperature": [
+ {
+ "number": 3,
+ "unit": "Degree"
+ },
+ {
+ "number": -27.5,
+ "unit": "C"
+ }
+ ]
+ }
+ ],
+ "ordinalV2": [
+ {
+ "offset": 3,
+ "relativeTo": "start"
+ },
+ {
+ "offset": 1,
+ "relativeTo": "start"
+ },
+ {
+ "offset": 1,
+ "relativeTo": "current"
+ },
+ {
+ "offset": -1,
+ "relativeTo": "current"
+ }
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 1.56337478E-06
+ },
+ "Delivery": {
+ "score": 0.0002846266
+ },
+ "EntityTests": {
+ "score": 0.953405857
+ },
+ "Greeting": {
+ "score": 8.20979437E-07
+ },
+ "Help": {
+ "score": 4.81870757E-06
+ },
+ "None": {
+ "score": 0.01040122
+ },
+ "Roles": {
+ "score": 0.197366714
+ },
+ "search": {
+ "score": 0.14049834
+ },
+ "SpecifyName": {
+ "score": 0.000137732946
+ },
+ "Travel": {
+ "score": 0.0100996653
+ },
+ "Weather.GetForecast": {
+ "score": 0.0143940123
+ }
+ },
+ "normalizedQuery": "12 years old and 3 days old and monday july 3rd, 2019 and every monday and between 3am and 5:30am and 4 acres and 4 pico meters and chrimc@hotmail.com and $4 and $4.25 and also 32 and 210.4 and first and 10% and 10.5% and 425-555-1234 and 3 degrees and -27.5 degrees c and the next one and the previous one",
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "topIntent": "EntityTests"
+ },
+ "query": "12 years old and 3 days old and monday july 3rd, 2019 and every monday and between 3am and 5:30am and 4 acres and 4 pico meters and chrimc@hotmail.com and $4 and $4.25 and also 32 and 210.4 and first and 10% and 10.5% and 425-555-1234 and 3 degrees and -27.5 degrees c and the next one and the previous one"
+ }
+ }
+}
diff --git a/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/NoEntitiesInstanceTrue.json b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/NoEntitiesInstanceTrue.json
new file mode 100644
index 000000000..32313e0e7
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/NoEntitiesInstanceTrue.json
@@ -0,0 +1,41 @@
+{
+ "entities": {
+ "$instance": {}
+ },
+ "intents": {
+ "Greeting": {
+ "score": 0.959510267
+ }
+ },
+ "sentiment": {
+ "label": "positive",
+ "score": 0.9431402
+ },
+ "text": "Hi",
+ "v3": {
+ "options": {
+ "IncludeAllIntents": false,
+ "IncludeAPIResults": true,
+ "IncludeInstanceData": true,
+ "Log": true,
+ "PreferExternalEntities": true,
+ "Slot": "production"
+ },
+ "response": {
+ "prediction": {
+ "entities": {},
+ "intents": {
+ "Greeting": {
+ "score": 0.959510267
+ }
+ },
+ "sentiment": {
+ "label": "positive",
+ "score": 0.9431402
+ },
+ "topIntent": "Greeting"
+ },
+ "query": "Hi"
+ }
+ }
+}
\ No newline at end of file
diff --git a/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/Patterns.json b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/Patterns.json
new file mode 100644
index 000000000..865967c22
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/Patterns.json
@@ -0,0 +1,363 @@
+{
+ "entities": {
+ "$instance": {
+ "extra": [
+ {
+ "endIndex": 76,
+ "modelType": "Pattern.Any Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 71,
+ "text": "kb435",
+ "type": "subject"
+ }
+ ],
+ "parent": [
+ {
+ "endIndex": 61,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 49,
+ "text": "bart simpson",
+ "type": "builtin.personName"
+ }
+ ],
+ "Part": [
+ {
+ "endIndex": 76,
+ "modelType": "Regex Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 71,
+ "text": "kb435",
+ "type": "Part"
+ }
+ ],
+ "person": [
+ {
+ "endIndex": 61,
+ "modelType": "Pattern.Any Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 49,
+ "text": "bart simpson",
+ "type": "person"
+ }
+ ],
+ "subject": [
+ {
+ "endIndex": 43,
+ "modelType": "Pattern.Any Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 12,
+ "text": "something wicked this way comes",
+ "type": "subject"
+ }
+ ]
+ },
+ "extra": [
+ "kb435"
+ ],
+ "parent": [
+ "bart simpson"
+ ],
+ "Part": [
+ "kb435"
+ ],
+ "person": [
+ "bart simpson"
+ ],
+ "subject": [
+ "something wicked this way comes"
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 1.02352937E-09
+ },
+ "Delivery": {
+ "score": 1.81E-09
+ },
+ "EntityTests": {
+ "score": 1.15439843E-05
+ },
+ "Greeting": {
+ "score": 1.09375E-09
+ },
+ "Help": {
+ "score": 1.02352937E-09
+ },
+ "None": {
+ "score": 2.394552E-06
+ },
+ "Roles": {
+ "score": 5.6224585E-06
+ },
+ "search": {
+ "score": 0.9999948
+ },
+ "SpecifyName": {
+ "score": 3.08333337E-09
+ },
+ "Travel": {
+ "score": 3.08333337E-09
+ },
+ "Weather_GetForecast": {
+ "score": 1.03386708E-06
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "text": "email about something wicked this way comes from bart simpson and also kb435",
+ "v2": {
+ "options": {
+ "IncludeAllIntents": true,
+ "IncludeInstanceData": true,
+ "LogPersonalInformation": false,
+ "Timeout": 100000.0
+ },
+ "response": {
+ "entities": [
+ {
+ "endIndex": 60,
+ "entity": "bart simpson",
+ "role": "parent",
+ "startIndex": 49,
+ "type": "builtin.personName"
+ },
+ {
+ "endIndex": 75,
+ "entity": "kb435",
+ "startIndex": 71,
+ "type": "Part"
+ },
+ {
+ "endIndex": 42,
+ "entity": "something wicked this way comes",
+ "role": "",
+ "startIndex": 12,
+ "type": "subject"
+ },
+ {
+ "endIndex": 60,
+ "entity": "bart simpson",
+ "role": "",
+ "startIndex": 49,
+ "type": "person"
+ },
+ {
+ "endIndex": 75,
+ "entity": "kb435",
+ "role": "extra",
+ "startIndex": 71,
+ "type": "subject"
+ }
+ ],
+ "intents": [
+ {
+ "intent": "search",
+ "score": 0.9999948
+ },
+ {
+ "intent": "EntityTests",
+ "score": 1.15439843E-05
+ },
+ {
+ "intent": "Roles",
+ "score": 5.6224585E-06
+ },
+ {
+ "intent": "None",
+ "score": 2.394552E-06
+ },
+ {
+ "intent": "Weather.GetForecast",
+ "score": 1.03386708E-06
+ },
+ {
+ "intent": "SpecifyName",
+ "score": 3.08333337E-09
+ },
+ {
+ "intent": "Travel",
+ "score": 3.08333337E-09
+ },
+ {
+ "intent": "Delivery",
+ "score": 1.81E-09
+ },
+ {
+ "intent": "Greeting",
+ "score": 1.09375E-09
+ },
+ {
+ "intent": "Cancel",
+ "score": 1.02352937E-09
+ },
+ {
+ "intent": "Help",
+ "score": 1.02352937E-09
+ }
+ ],
+ "query": "email about something wicked this way comes from bart simpson and also kb435",
+ "sentimentAnalysis": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "topScoringIntent": {
+ "intent": "search",
+ "score": 0.9999948
+ }
+ }
+ },
+ "v3": {
+ "options": {
+ "IncludeAllIntents": true,
+ "IncludeAPIResults": true,
+ "IncludeInstanceData": true,
+ "Log": true,
+ "PreferExternalEntities": true,
+ "Slot": "production"
+ },
+ "response": {
+ "prediction": {
+ "entities": {
+ "$instance": {
+ "extra": [
+ {
+ "length": 5,
+ "modelType": "Pattern.Any Entity Extractor",
+ "modelTypeId": 7,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "extra",
+ "startIndex": 71,
+ "text": "kb435",
+ "type": "subject"
+ }
+ ],
+ "parent": [
+ {
+ "length": 12,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "parent",
+ "startIndex": 49,
+ "text": "bart simpson",
+ "type": "builtin.personName"
+ }
+ ],
+ "Part": [
+ {
+ "length": 5,
+ "modelType": "Regex Entity Extractor",
+ "modelTypeId": 8,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 71,
+ "text": "kb435",
+ "type": "Part"
+ }
+ ],
+ "person": [
+ {
+ "length": 12,
+ "modelType": "Pattern.Any Entity Extractor",
+ "modelTypeId": 7,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 49,
+ "text": "bart simpson",
+ "type": "person"
+ }
+ ],
+ "subject": [
+ {
+ "length": 31,
+ "modelType": "Pattern.Any Entity Extractor",
+ "modelTypeId": 7,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 12,
+ "text": "something wicked this way comes",
+ "type": "subject"
+ }
+ ]
+ },
+ "extra": [
+ "kb435"
+ ],
+ "parent": [
+ "bart simpson"
+ ],
+ "Part": [
+ "kb435"
+ ],
+ "person": [
+ "bart simpson"
+ ],
+ "subject": [
+ "something wicked this way comes"
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 1.02352937E-09
+ },
+ "Delivery": {
+ "score": 1.81E-09
+ },
+ "EntityTests": {
+ "score": 1.15439843E-05
+ },
+ "Greeting": {
+ "score": 1.09375E-09
+ },
+ "Help": {
+ "score": 1.02352937E-09
+ },
+ "None": {
+ "score": 2.394552E-06
+ },
+ "Roles": {
+ "score": 5.6224585E-06
+ },
+ "search": {
+ "score": 0.9999948
+ },
+ "SpecifyName": {
+ "score": 3.08333337E-09
+ },
+ "Travel": {
+ "score": 3.08333337E-09
+ },
+ "Weather.GetForecast": {
+ "score": 1.03386708E-06
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "topIntent": "search"
+ },
+ "query": "email about something wicked this way comes from bart simpson and also kb435"
+ }
+ }
+}
\ No newline at end of file
diff --git a/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/Prebuilt.json b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/Prebuilt.json
new file mode 100644
index 000000000..1ccad7581
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/Prebuilt.json
@@ -0,0 +1,351 @@
+{
+ "entities": {
+ "$instance": {
+ "Composite2": [
+ {
+ "endIndex": 66,
+ "modelType": "Composite Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 0,
+ "text": "http://foo.com is where you can get a weather forecast for seattle",
+ "type": "Composite2"
+ }
+ ],
+ "geographyV2": [
+ {
+ "endIndex": 66,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 59,
+ "text": "seattle",
+ "type": "builtin.geographyV2.city"
+ }
+ ],
+ "oldURL": [
+ {
+ "endIndex": 14,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 0,
+ "text": "http://foo.com",
+ "type": "builtin.url"
+ }
+ ]
+ },
+ "Composite2": [
+ {
+ "$instance": {
+ "Weather_Location": [
+ {
+ "endIndex": 66,
+ "modelType": "Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 59,
+ "text": "seattle",
+ "type": "Weather.Location"
+ }
+ ]
+ },
+ "Weather_Location": [
+ "seattle"
+ ]
+ }
+ ],
+ "geographyV2": [
+ {
+ "location": "seattle",
+ "type": "city"
+ }
+ ],
+ "oldURL": [
+ "http://foo.com"
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 0.00017013021
+ },
+ "Delivery": {
+ "score": 0.00114031672
+ },
+ "EntityTests": {
+ "score": 0.286522
+ },
+ "Greeting": {
+ "score": 0.000150978623
+ },
+ "Help": {
+ "score": 0.000547617
+ },
+ "None": {
+ "score": 0.01798658
+ },
+ "Roles": {
+ "score": 0.0459664278
+ },
+ "search": {
+ "score": 0.0009428267
+ },
+ "SpecifyName": {
+ "score": 0.0009960134
+ },
+ "Travel": {
+ "score": 0.00235179346
+ },
+ "Weather_GetForecast": {
+ "score": 0.6732952
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "text": "http://foo.com is where you can get a weather forecast for seattle",
+ "v2": {
+ "options": {
+ "IncludeAllIntents": true,
+ "IncludeInstanceData": true,
+ "LogPersonalInformation": false,
+ "Timeout": 100000.0
+ },
+ "response": {
+ "compositeEntities": [
+ {
+ "children": [
+ {
+ "type": "Weather.Location",
+ "value": "seattle"
+ }
+ ],
+ "parentType": "Composite2",
+ "value": "http : / / foo . com is where you can get a weather forecast for seattle"
+ }
+ ],
+ "entities": [
+ {
+ "endIndex": 65,
+ "entity": "seattle",
+ "score": 0.8245291,
+ "startIndex": 59,
+ "type": "Weather.Location"
+ },
+ {
+ "endIndex": 65,
+ "entity": "http : / / foo . com is where you can get a weather forecast for seattle",
+ "score": 0.6503277,
+ "startIndex": 0,
+ "type": "Composite2"
+ },
+ {
+ "endIndex": 65,
+ "entity": "seattle",
+ "startIndex": 59,
+ "type": "builtin.geographyV2.city"
+ },
+ {
+ "endIndex": 13,
+ "entity": "http://foo.com",
+ "resolution": {
+ "value": "http://foo.com"
+ },
+ "role": "oldURL",
+ "startIndex": 0,
+ "type": "builtin.url"
+ }
+ ],
+ "intents": [
+ {
+ "intent": "Weather.GetForecast",
+ "score": 0.6732952
+ },
+ {
+ "intent": "EntityTests",
+ "score": 0.286522
+ },
+ {
+ "intent": "Roles",
+ "score": 0.0459664278
+ },
+ {
+ "intent": "None",
+ "score": 0.01798658
+ },
+ {
+ "intent": "Travel",
+ "score": 0.00235179346
+ },
+ {
+ "intent": "Delivery",
+ "score": 0.00114031672
+ },
+ {
+ "intent": "SpecifyName",
+ "score": 0.0009960134
+ },
+ {
+ "intent": "search",
+ "score": 0.0009428267
+ },
+ {
+ "intent": "Help",
+ "score": 0.000547617
+ },
+ {
+ "intent": "Cancel",
+ "score": 0.00017013021
+ },
+ {
+ "intent": "Greeting",
+ "score": 0.000150978623
+ }
+ ],
+ "query": "http://foo.com is where you can get a weather forecast for seattle",
+ "sentimentAnalysis": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "topScoringIntent": {
+ "intent": "Weather.GetForecast",
+ "score": 0.6732952
+ }
+ }
+ },
+ "v3": {
+ "options": {
+ "IncludeAllIntents": true,
+ "IncludeAPIResults": true,
+ "IncludeInstanceData": true,
+ "Log": true,
+ "PreferExternalEntities": true,
+ "Slot": "production"
+ },
+ "response": {
+ "prediction": {
+ "entities": {
+ "$instance": {
+ "Composite2": [
+ {
+ "length": 66,
+ "modelType": "Composite Entity Extractor",
+ "modelTypeId": 4,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 0,
+ "text": "http://foo.com is where you can get a weather forecast for seattle",
+ "type": "Composite2"
+ }
+ ],
+ "geographyV2": [
+ {
+ "length": 7,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 59,
+ "text": "seattle",
+ "type": "builtin.geographyV2.city"
+ }
+ ],
+ "oldURL": [
+ {
+ "length": 14,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "oldURL",
+ "startIndex": 0,
+ "text": "http://foo.com",
+ "type": "builtin.url"
+ }
+ ]
+ },
+ "Composite2": [
+ {
+ "$instance": {
+ "Weather.Location": [
+ {
+ "length": 7,
+ "modelType": "Entity Extractor",
+ "modelTypeId": 1,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 59,
+ "text": "seattle",
+ "type": "Weather.Location"
+ }
+ ]
+ },
+ "Weather.Location": [
+ "seattle"
+ ]
+ }
+ ],
+ "geographyV2": [
+ {
+ "type": "city",
+ "value": "seattle"
+ }
+ ],
+ "oldURL": [
+ "http://foo.com"
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 0.00017013021
+ },
+ "Delivery": {
+ "score": 0.00114031672
+ },
+ "EntityTests": {
+ "score": 0.286522
+ },
+ "Greeting": {
+ "score": 0.000150978623
+ },
+ "Help": {
+ "score": 0.000547617
+ },
+ "None": {
+ "score": 0.01798658
+ },
+ "Roles": {
+ "score": 0.0459664278
+ },
+ "search": {
+ "score": 0.0009428267
+ },
+ "SpecifyName": {
+ "score": 0.0009960134
+ },
+ "Travel": {
+ "score": 0.00235179346
+ },
+ "Weather.GetForecast": {
+ "score": 0.6732952
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "topIntent": "Weather.GetForecast"
+ },
+ "query": "http://foo.com is where you can get a weather forecast for seattle"
+ }
+ }
+}
diff --git a/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/TestRecognizerResultConvert.java b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/TestRecognizerResultConvert.java
new file mode 100644
index 000000000..8e6f6b4bc
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/TestRecognizerResultConvert.java
@@ -0,0 +1,15 @@
+package com.microsoft.bot.ai.luis.testdata;
+
+import com.microsoft.bot.builder.RecognizerConvert;
+import com.microsoft.bot.builder.RecognizerResult;
+
+public class TestRecognizerResultConvert implements RecognizerConvert {
+
+ public String recognizerResultText;
+
+ @Override
+ public void convert(Object result) {
+ RecognizerResult castedObject = ((RecognizerResult) result);
+ recognizerResultText = castedObject.getText();
+ }
+}
diff --git a/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/TraceActivity.json b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/TraceActivity.json
new file mode 100644
index 000000000..da661fa29
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/TraceActivity.json
@@ -0,0 +1,247 @@
+{
+ "entities": {
+ "$instance": {
+ "Name": [
+ {
+ "endIndex": 15,
+ "modelType": "Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 11,
+ "text": "Emad",
+ "type": "Name"
+ }
+ ],
+ "personName": [
+ {
+ "endIndex": 15,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 11,
+ "text": "Emad",
+ "type": "builtin.personName"
+ }
+ ]
+ },
+ "Name": [
+ "Emad"
+ ],
+ "personName": [
+ "Emad"
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 0.00555860251
+ },
+ "Delivery": {
+ "score": 0.005572036
+ },
+ "EntityTests": {
+ "score": 0.006504555
+ },
+ "Greeting": {
+ "score": 0.07429792
+ },
+ "Help": {
+ "score": 0.004867298
+ },
+ "None": {
+ "score": 0.0109896818
+ },
+ "Roles": {
+ "score": 0.0382854156
+ },
+ "search": {
+ "score": 0.0006921758
+ },
+ "SpecifyName": {
+ "score": 0.794012964
+ },
+ "Travel": {
+ "score": 0.00203858572
+ },
+ "Weather_GetForecast": {
+ "score": 0.006886828
+ }
+ },
+ "sentiment": {
+ "label": "positive",
+ "score": 0.7930478
+ },
+ "text": "My name is Emad",
+ "v2": {
+ "options": {
+ "IncludeAllIntents": true,
+ "IncludeInstanceData": true,
+ "LogPersonalInformation": false,
+ "Timeout": 100000.0
+ },
+ "response": {
+ "entities": [
+ {
+ "endIndex": 14,
+ "entity": "emad",
+ "score": 0.980508447,
+ "startIndex": 11,
+ "type": "Name"
+ },
+ {
+ "endIndex": 14,
+ "entity": "emad",
+ "startIndex": 11,
+ "type": "builtin.personName"
+ }
+ ],
+ "intents": [
+ {
+ "intent": "SpecifyName",
+ "score": 0.794012964
+ },
+ {
+ "intent": "Greeting",
+ "score": 0.07429792
+ },
+ {
+ "intent": "Roles",
+ "score": 0.0382854156
+ },
+ {
+ "intent": "None",
+ "score": 0.0109896818
+ },
+ {
+ "intent": "Weather.GetForecast",
+ "score": 0.006886828
+ },
+ {
+ "intent": "EntityTests",
+ "score": 0.006504555
+ },
+ {
+ "intent": "Delivery",
+ "score": 0.005572036
+ },
+ {
+ "intent": "Cancel",
+ "score": 0.00555860251
+ },
+ {
+ "intent": "Help",
+ "score": 0.004867298
+ },
+ {
+ "intent": "Travel",
+ "score": 0.00203858572
+ },
+ {
+ "intent": "search",
+ "score": 0.0006921758
+ }
+ ],
+ "query": "My name is Emad",
+ "sentimentAnalysis": {
+ "label": "positive",
+ "score": 0.7930478
+ },
+ "topScoringIntent": {
+ "intent": "SpecifyName",
+ "score": 0.794012964
+ }
+ }
+ },
+ "v3": {
+ "options": {
+ "IncludeAllIntents": true,
+ "IncludeAPIResults": true,
+ "IncludeInstanceData": true,
+ "Log": true,
+ "PreferExternalEntities": true,
+ "Slot": "production"
+ },
+ "response": {
+ "prediction": {
+ "entities": {
+ "$instance": {
+ "Name": [
+ {
+ "length": 4,
+ "modelType": "Entity Extractor",
+ "modelTypeId": 1,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 11,
+ "text": "Emad",
+ "type": "Name"
+ }
+ ],
+ "personName": [
+ {
+ "length": 4,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 11,
+ "text": "Emad",
+ "type": "builtin.personName"
+ }
+ ]
+ },
+ "Name": [
+ "Emad"
+ ],
+ "personName": [
+ "Emad"
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 0.00555860251
+ },
+ "Delivery": {
+ "score": 0.005572036
+ },
+ "EntityTests": {
+ "score": 0.006504555
+ },
+ "Greeting": {
+ "score": 0.07429792
+ },
+ "Help": {
+ "score": 0.004867298
+ },
+ "None": {
+ "score": 0.0109896818
+ },
+ "Roles": {
+ "score": 0.0382854156
+ },
+ "search": {
+ "score": 0.0006921758
+ },
+ "SpecifyName": {
+ "score": 0.794012964
+ },
+ "Travel": {
+ "score": 0.00203858572
+ },
+ "Weather.GetForecast": {
+ "score": 0.006886828
+ }
+ },
+ "sentiment": {
+ "label": "positive",
+ "score": 0.7930478
+ },
+ "topIntent": "SpecifyName"
+ },
+ "query": "My name is Emad"
+ }
+ }
+}
diff --git a/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/Typed.json b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/Typed.json
new file mode 100644
index 000000000..88b2a1002
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/Typed.json
@@ -0,0 +1,1971 @@
+{
+ "entities": {
+ "$instance": {
+ "begin": [
+ {
+ "endIndex": 12,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 0,
+ "text": "12 years old",
+ "type": "builtin.age"
+ }
+ ],
+ "Composite1": [
+ {
+ "endIndex": 306,
+ "modelType": "Composite Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 0,
+ "text": "12 years old and 3 days old and monday july 3rd, 2019 and every monday and between 3am and 5:30am and 4 acres and 4 pico meters and chrimc@hotmail.com and $4 and $4.25 and also 32 and 210.4 and first and 10% and 10.5% and 425-555-1234 and 3 degrees and -27.5 degrees c and the next one and the previous one",
+ "type": "Composite1"
+ }
+ ],
+ "end": [
+ {
+ "endIndex": 27,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 17,
+ "text": "3 days old",
+ "type": "builtin.age"
+ }
+ ],
+ "endpos": [
+ {
+ "endIndex": 47,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 44,
+ "text": "3rd",
+ "type": "builtin.ordinalV2"
+ }
+ ],
+ "max": [
+ {
+ "endIndex": 167,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 162,
+ "text": "$4.25",
+ "type": "builtin.currency"
+ }
+ ],
+ "ordinalV2": [
+ {
+ "endIndex": 199,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 194,
+ "text": "first",
+ "type": "builtin.ordinalV2"
+ },
+ {
+ "endIndex": 285,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 277,
+ "text": "next one",
+ "type": "builtin.ordinalV2.relative"
+ },
+ {
+ "endIndex": 306,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 294,
+ "text": "previous one",
+ "type": "builtin.ordinalV2.relative"
+ }
+ ]
+ },
+ "begin": [
+ {
+ "number": 12,
+ "units": "Year"
+ }
+ ],
+ "Composite1": [
+ {
+ "$instance": {
+ "datetime": [
+ {
+ "endIndex": 8,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 0,
+ "text": "12 years",
+ "type": "builtin.datetimeV2.duration"
+ },
+ {
+ "endIndex": 23,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 17,
+ "text": "3 days",
+ "type": "builtin.datetimeV2.duration"
+ },
+ {
+ "endIndex": 53,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 32,
+ "text": "monday july 3rd, 2019",
+ "type": "builtin.datetimeV2.date"
+ },
+ {
+ "endIndex": 70,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 58,
+ "text": "every monday",
+ "type": "builtin.datetimeV2.set"
+ },
+ {
+ "endIndex": 97,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 75,
+ "text": "between 3am and 5:30am",
+ "type": "builtin.datetimeV2.timerange"
+ }
+ ],
+ "dimension": [
+ {
+ "endIndex": 109,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 102,
+ "text": "4 acres",
+ "type": "builtin.dimension"
+ },
+ {
+ "endIndex": 127,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 114,
+ "text": "4 pico meters",
+ "type": "builtin.dimension"
+ }
+ ],
+ "email": [
+ {
+ "endIndex": 150,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 132,
+ "text": "chrimc@hotmail.com",
+ "type": "builtin.email"
+ }
+ ],
+ "money": [
+ {
+ "endIndex": 157,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 155,
+ "text": "$4",
+ "type": "builtin.currency"
+ }
+ ],
+ "number": [
+ {
+ "endIndex": 2,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 0,
+ "text": "12",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 18,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 17,
+ "text": "3",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 53,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 49,
+ "text": "2019",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 92,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 91,
+ "text": "5",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 103,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 102,
+ "text": "4",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 115,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 114,
+ "text": "4",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 157,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 156,
+ "text": "4",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 167,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 163,
+ "text": "4.25",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 179,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 177,
+ "text": "32",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 189,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 184,
+ "text": "210.4",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 206,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 204,
+ "text": "10",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 216,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 212,
+ "text": "10.5",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 225,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 222,
+ "text": "425",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 229,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 226,
+ "text": "555",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 234,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 230,
+ "text": "1234",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 240,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 239,
+ "text": "3",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 258,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 253,
+ "text": "-27.5",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 285,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 282,
+ "text": "one",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 306,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 303,
+ "text": "one",
+ "type": "builtin.number"
+ }
+ ],
+ "percentage": [
+ {
+ "endIndex": 207,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 204,
+ "text": "10%",
+ "type": "builtin.percentage"
+ },
+ {
+ "endIndex": 217,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 212,
+ "text": "10.5%",
+ "type": "builtin.percentage"
+ }
+ ],
+ "phonenumber": [
+ {
+ "endIndex": 234,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "score": 0.9,
+ "startIndex": 222,
+ "text": "425-555-1234",
+ "type": "builtin.phonenumber"
+ }
+ ],
+ "temperature": [
+ {
+ "endIndex": 248,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 239,
+ "text": "3 degrees",
+ "type": "builtin.temperature"
+ },
+ {
+ "endIndex": 268,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 253,
+ "text": "-27.5 degrees c",
+ "type": "builtin.temperature"
+ }
+ ]
+ },
+ "datetime": [
+ {
+ "timex": [
+ "P12Y"
+ ],
+ "type": "duration"
+ },
+ {
+ "timex": [
+ "P3D"
+ ],
+ "type": "duration"
+ },
+ {
+ "timex": [
+ "2019-07-03"
+ ],
+ "type": "date"
+ },
+ {
+ "timex": [
+ "XXXX-WXX-1"
+ ],
+ "type": "set"
+ },
+ {
+ "timex": [
+ "(T03,T05:30,PT2H30M)"
+ ],
+ "type": "timerange"
+ }
+ ],
+ "dimension": [
+ {
+ "number": 4,
+ "units": "Acre"
+ },
+ {
+ "number": 4,
+ "units": "Picometer"
+ }
+ ],
+ "email": [
+ "chrimc@hotmail.com"
+ ],
+ "money": [
+ {
+ "number": 4,
+ "units": "Dollar"
+ }
+ ],
+ "number": [
+ 12,
+ 3,
+ 2019,
+ 5,
+ 4,
+ 4,
+ 4,
+ 4.25,
+ 32,
+ 210.4,
+ 10,
+ 10.5,
+ 425,
+ 555,
+ 1234,
+ 3,
+ -27.5,
+ 1,
+ 1
+ ],
+ "percentage": [
+ 10,
+ 10.5
+ ],
+ "phonenumber": [
+ "425-555-1234"
+ ],
+ "temperature": [
+ {
+ "number": 3,
+ "units": "Degree"
+ },
+ {
+ "number": -27.5,
+ "units": "C"
+ }
+ ]
+ }
+ ],
+ "end": [
+ {
+ "number": 3,
+ "units": "Day"
+ }
+ ],
+ "endpos": [
+ {
+ "offset": 3,
+ "relativeTo": "start"
+ }
+ ],
+ "max": [
+ {
+ "number": 4.25,
+ "units": "Dollar"
+ }
+ ],
+ "ordinalV2": [
+ {
+ "offset": 1,
+ "relativeTo": "start"
+ },
+ {
+ "offset": 1,
+ "relativeTo": "current"
+ },
+ {
+ "offset": -1,
+ "relativeTo": "current"
+ }
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 1.54311692E-06
+ },
+ "Delivery": {
+ "score": 0.000280677923
+ },
+ "EntityTests": {
+ "score": 0.958614767
+ },
+ "Greeting": {
+ "score": 8.076372E-07
+ },
+ "Help": {
+ "score": 4.74059061E-06
+ },
+ "None": {
+ "score": 0.0101076821
+ },
+ "Roles": {
+ "score": 0.191202149
+ },
+ "search": {
+ "score": 0.00475360872
+ },
+ "SpecifyName": {
+ "score": 7.367716E-05
+ },
+ "Travel": {
+ "score": 0.00232480234
+ },
+ "Weather_GetForecast": {
+ "score": 0.0141556319
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "text": "12 years old and 3 days old and monday july 3rd, 2019 and every monday and between 3am and 5:30am and 4 acres and 4 pico meters and chrimc@hotmail.com and $4 and $4.25 and also 32 and 210.4 and first and 10% and 10.5% and 425-555-1234 and 3 degrees and -27.5 degrees c and the next one and the previous one",
+ "v2": {
+ "options": {
+ "IncludeAllIntents": true,
+ "IncludeInstanceData": true,
+ "LogPersonalInformation": false,
+ "Timeout": 100000.0
+ },
+ "response": {
+ "compositeEntities": [
+ {
+ "children": [
+ {
+ "type": "builtin.datetimeV2.duration",
+ "value": "12 years"
+ },
+ {
+ "type": "builtin.datetimeV2.duration",
+ "value": "3 days"
+ },
+ {
+ "type": "builtin.datetimeV2.date",
+ "value": "monday july 3rd, 2019"
+ },
+ {
+ "type": "builtin.datetimeV2.set",
+ "value": "every monday"
+ },
+ {
+ "type": "builtin.datetimeV2.timerange",
+ "value": "between 3am and 5:30am"
+ },
+ {
+ "type": "builtin.dimension",
+ "value": "4 acres"
+ },
+ {
+ "type": "builtin.dimension",
+ "value": "4 pico meters"
+ },
+ {
+ "type": "builtin.email",
+ "value": "chrimc@hotmail.com"
+ },
+ {
+ "type": "builtin.currency",
+ "value": "$4"
+ },
+ {
+ "type": "builtin.number",
+ "value": "12"
+ },
+ {
+ "type": "builtin.number",
+ "value": "3"
+ },
+ {
+ "type": "builtin.number",
+ "value": "2019"
+ },
+ {
+ "type": "builtin.number",
+ "value": "5"
+ },
+ {
+ "type": "builtin.number",
+ "value": "4"
+ },
+ {
+ "type": "builtin.number",
+ "value": "4"
+ },
+ {
+ "type": "builtin.number",
+ "value": "4"
+ },
+ {
+ "type": "builtin.number",
+ "value": "4.25"
+ },
+ {
+ "type": "builtin.number",
+ "value": "32"
+ },
+ {
+ "type": "builtin.number",
+ "value": "210.4"
+ },
+ {
+ "type": "builtin.number",
+ "value": "10"
+ },
+ {
+ "type": "builtin.number",
+ "value": "10.5"
+ },
+ {
+ "type": "builtin.number",
+ "value": "425"
+ },
+ {
+ "type": "builtin.number",
+ "value": "555"
+ },
+ {
+ "type": "builtin.number",
+ "value": "1234"
+ },
+ {
+ "type": "builtin.number",
+ "value": "3"
+ },
+ {
+ "type": "builtin.number",
+ "value": "-27.5"
+ },
+ {
+ "type": "builtin.number",
+ "value": "one"
+ },
+ {
+ "type": "builtin.number",
+ "value": "one"
+ },
+ {
+ "type": "builtin.percentage",
+ "value": "10%"
+ },
+ {
+ "type": "builtin.percentage",
+ "value": "10.5%"
+ },
+ {
+ "type": "builtin.phonenumber",
+ "value": "425-555-1234"
+ },
+ {
+ "type": "builtin.temperature",
+ "value": "3 degrees"
+ },
+ {
+ "type": "builtin.temperature",
+ "value": "-27.5 degrees c"
+ }
+ ],
+ "parentType": "Composite1",
+ "value": "12 years old and 3 days old and monday july 3rd , 2019 and every monday and between 3am and 5 : 30am and 4 acres and 4 pico meters and chrimc @ hotmail . com and $ 4 and $ 4 . 25 and also 32 and 210 . 4 and first and 10 % and 10 . 5 % and 425 - 555 - 1234 and 3 degrees and - 27 . 5 degrees c and the next one and the previous one"
+ }
+ ],
+ "entities": [
+ {
+ "endIndex": 305,
+ "entity": "12 years old and 3 days old and monday july 3rd , 2019 and every monday and between 3am and 5 : 30am and 4 acres and 4 pico meters and chrimc @ hotmail . com and $ 4 and $ 4 . 25 and also 32 and 210 . 4 and first and 10 % and 10 . 5 % and 425 - 555 - 1234 and 3 degrees and - 27 . 5 degrees c and the next one and the previous one",
+ "score": 0.9074669,
+ "startIndex": 0,
+ "type": "Composite1"
+ },
+ {
+ "endIndex": 1,
+ "entity": "12",
+ "resolution": {
+ "subtype": "integer",
+ "value": "12"
+ },
+ "startIndex": 0,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 17,
+ "entity": "3",
+ "resolution": {
+ "subtype": "integer",
+ "value": "3"
+ },
+ "startIndex": 17,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 52,
+ "entity": "2019",
+ "resolution": {
+ "subtype": "integer",
+ "value": "2019"
+ },
+ "startIndex": 49,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 91,
+ "entity": "5",
+ "resolution": {
+ "subtype": "integer",
+ "value": "5"
+ },
+ "startIndex": 91,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 102,
+ "entity": "4",
+ "resolution": {
+ "subtype": "integer",
+ "value": "4"
+ },
+ "startIndex": 102,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 114,
+ "entity": "4",
+ "resolution": {
+ "subtype": "integer",
+ "value": "4"
+ },
+ "startIndex": 114,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 156,
+ "entity": "4",
+ "resolution": {
+ "subtype": "integer",
+ "value": "4"
+ },
+ "startIndex": 156,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 166,
+ "entity": "4.25",
+ "resolution": {
+ "subtype": "decimal",
+ "value": "4.25"
+ },
+ "startIndex": 163,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 178,
+ "entity": "32",
+ "resolution": {
+ "subtype": "integer",
+ "value": "32"
+ },
+ "startIndex": 177,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 188,
+ "entity": "210.4",
+ "resolution": {
+ "subtype": "decimal",
+ "value": "210.4"
+ },
+ "startIndex": 184,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 205,
+ "entity": "10",
+ "resolution": {
+ "subtype": "integer",
+ "value": "10"
+ },
+ "startIndex": 204,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 215,
+ "entity": "10.5",
+ "resolution": {
+ "subtype": "decimal",
+ "value": "10.5"
+ },
+ "startIndex": 212,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 224,
+ "entity": "425",
+ "resolution": {
+ "subtype": "integer",
+ "value": "425"
+ },
+ "startIndex": 222,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 228,
+ "entity": "555",
+ "resolution": {
+ "subtype": "integer",
+ "value": "555"
+ },
+ "startIndex": 226,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 233,
+ "entity": "1234",
+ "resolution": {
+ "subtype": "integer",
+ "value": "1234"
+ },
+ "startIndex": 230,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 239,
+ "entity": "3",
+ "resolution": {
+ "subtype": "integer",
+ "value": "3"
+ },
+ "startIndex": 239,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 257,
+ "entity": "-27.5",
+ "resolution": {
+ "subtype": "decimal",
+ "value": "-27.5"
+ },
+ "startIndex": 253,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 284,
+ "entity": "one",
+ "resolution": {
+ "subtype": "integer",
+ "value": "1"
+ },
+ "startIndex": 282,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 305,
+ "entity": "one",
+ "resolution": {
+ "subtype": "integer",
+ "value": "1"
+ },
+ "startIndex": 303,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 11,
+ "entity": "12 years old",
+ "resolution": {
+ "unit": "Year",
+ "value": "12"
+ },
+ "role": "begin",
+ "startIndex": 0,
+ "type": "builtin.age"
+ },
+ {
+ "endIndex": 26,
+ "entity": "3 days old",
+ "resolution": {
+ "unit": "Day",
+ "value": "3"
+ },
+ "role": "end",
+ "startIndex": 17,
+ "type": "builtin.age"
+ },
+ {
+ "endIndex": 7,
+ "entity": "12 years",
+ "resolution": {
+ "values": [
+ {
+ "timex": "P12Y",
+ "type": "duration",
+ "value": "378432000"
+ }
+ ]
+ },
+ "startIndex": 0,
+ "type": "builtin.datetimeV2.duration"
+ },
+ {
+ "endIndex": 22,
+ "entity": "3 days",
+ "resolution": {
+ "values": [
+ {
+ "timex": "P3D",
+ "type": "duration",
+ "value": "259200"
+ }
+ ]
+ },
+ "startIndex": 17,
+ "type": "builtin.datetimeV2.duration"
+ },
+ {
+ "endIndex": 52,
+ "entity": "monday july 3rd, 2019",
+ "resolution": {
+ "values": [
+ {
+ "timex": "2019-07-03",
+ "type": "date",
+ "value": "2019-07-03"
+ }
+ ]
+ },
+ "startIndex": 32,
+ "type": "builtin.datetimeV2.date"
+ },
+ {
+ "endIndex": 69,
+ "entity": "every monday",
+ "resolution": {
+ "values": [
+ {
+ "timex": "XXXX-WXX-1",
+ "type": "set",
+ "value": "not resolved"
+ }
+ ]
+ },
+ "startIndex": 58,
+ "type": "builtin.datetimeV2.set"
+ },
+ {
+ "endIndex": 96,
+ "entity": "between 3am and 5:30am",
+ "resolution": {
+ "values": [
+ {
+ "end": "05:30:00",
+ "start": "03:00:00",
+ "timex": "(T03,T05:30,PT2H30M)",
+ "type": "timerange"
+ }
+ ]
+ },
+ "startIndex": 75,
+ "type": "builtin.datetimeV2.timerange"
+ },
+ {
+ "endIndex": 108,
+ "entity": "4 acres",
+ "resolution": {
+ "unit": "Acre",
+ "value": "4"
+ },
+ "startIndex": 102,
+ "type": "builtin.dimension"
+ },
+ {
+ "endIndex": 126,
+ "entity": "4 pico meters",
+ "resolution": {
+ "unit": "Picometer",
+ "value": "4"
+ },
+ "startIndex": 114,
+ "type": "builtin.dimension"
+ },
+ {
+ "endIndex": 149,
+ "entity": "chrimc@hotmail.com",
+ "resolution": {
+ "value": "chrimc@hotmail.com"
+ },
+ "startIndex": 132,
+ "type": "builtin.email"
+ },
+ {
+ "endIndex": 156,
+ "entity": "$4",
+ "resolution": {
+ "unit": "Dollar",
+ "value": "4"
+ },
+ "startIndex": 155,
+ "type": "builtin.currency"
+ },
+ {
+ "endIndex": 166,
+ "entity": "$4.25",
+ "resolution": {
+ "unit": "Dollar",
+ "value": "4.25"
+ },
+ "role": "max",
+ "startIndex": 162,
+ "type": "builtin.currency"
+ },
+ {
+ "endIndex": 46,
+ "entity": "3rd",
+ "resolution": {
+ "offset": "3",
+ "relativeTo": "start"
+ },
+ "role": "endpos",
+ "startIndex": 44,
+ "type": "builtin.ordinalV2"
+ },
+ {
+ "endIndex": 198,
+ "entity": "first",
+ "resolution": {
+ "offset": "1",
+ "relativeTo": "start"
+ },
+ "startIndex": 194,
+ "type": "builtin.ordinalV2"
+ },
+ {
+ "endIndex": 284,
+ "entity": "next one",
+ "resolution": {
+ "offset": "1",
+ "relativeTo": "current"
+ },
+ "startIndex": 277,
+ "type": "builtin.ordinalV2.relative"
+ },
+ {
+ "endIndex": 305,
+ "entity": "previous one",
+ "resolution": {
+ "offset": "-1",
+ "relativeTo": "current"
+ },
+ "startIndex": 294,
+ "type": "builtin.ordinalV2.relative"
+ },
+ {
+ "endIndex": 206,
+ "entity": "10%",
+ "resolution": {
+ "value": "10%"
+ },
+ "startIndex": 204,
+ "type": "builtin.percentage"
+ },
+ {
+ "endIndex": 216,
+ "entity": "10.5%",
+ "resolution": {
+ "value": "10.5%"
+ },
+ "startIndex": 212,
+ "type": "builtin.percentage"
+ },
+ {
+ "endIndex": 233,
+ "entity": "425-555-1234",
+ "resolution": {
+ "score": "0.9",
+ "value": "425-555-1234"
+ },
+ "startIndex": 222,
+ "type": "builtin.phonenumber"
+ },
+ {
+ "endIndex": 247,
+ "entity": "3 degrees",
+ "resolution": {
+ "unit": "Degree",
+ "value": "3"
+ },
+ "startIndex": 239,
+ "type": "builtin.temperature"
+ },
+ {
+ "endIndex": 267,
+ "entity": "-27.5 degrees c",
+ "resolution": {
+ "unit": "C",
+ "value": "-27.5"
+ },
+ "startIndex": 253,
+ "type": "builtin.temperature"
+ }
+ ],
+ "intents": [
+ {
+ "intent": "EntityTests",
+ "score": 0.958614767
+ },
+ {
+ "intent": "Roles",
+ "score": 0.191202149
+ },
+ {
+ "intent": "Weather.GetForecast",
+ "score": 0.0141556319
+ },
+ {
+ "intent": "None",
+ "score": 0.0101076821
+ },
+ {
+ "intent": "search",
+ "score": 0.00475360872
+ },
+ {
+ "intent": "Travel",
+ "score": 0.00232480234
+ },
+ {
+ "intent": "Delivery",
+ "score": 0.000280677923
+ },
+ {
+ "intent": "SpecifyName",
+ "score": 7.367716E-05
+ },
+ {
+ "intent": "Help",
+ "score": 4.74059061E-06
+ },
+ {
+ "intent": "Cancel",
+ "score": 1.54311692E-06
+ },
+ {
+ "intent": "Greeting",
+ "score": 8.076372E-07
+ }
+ ],
+ "query": "12 years old and 3 days old and monday july 3rd, 2019 and every monday and between 3am and 5:30am and 4 acres and 4 pico meters and chrimc@hotmail.com and $4 and $4.25 and also 32 and 210.4 and first and 10% and 10.5% and 425-555-1234 and 3 degrees and -27.5 degrees c and the next one and the previous one",
+ "sentimentAnalysis": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "topScoringIntent": {
+ "intent": "EntityTests",
+ "score": 0.958614767
+ }
+ }
+ },
+ "v3": {
+ "options": {
+ "IncludeAllIntents": true,
+ "IncludeAPIResults": true,
+ "IncludeInstanceData": true,
+ "Log": true,
+ "PreferExternalEntities": true,
+ "Slot": "production"
+ },
+ "response": {
+ "prediction": {
+ "entities": {
+ "$instance": {
+ "begin": [
+ {
+ "length": 12,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "begin",
+ "startIndex": 0,
+ "text": "12 years old",
+ "type": "builtin.age"
+ }
+ ],
+ "Composite1": [
+ {
+ "length": 306,
+ "modelType": "Composite Entity Extractor",
+ "modelTypeId": 4,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 0,
+ "text": "12 years old and 3 days old and monday july 3rd, 2019 and every monday and between 3am and 5:30am and 4 acres and 4 pico meters and chrimc@hotmail.com and $4 and $4.25 and also 32 and 210.4 and first and 10% and 10.5% and 425-555-1234 and 3 degrees and -27.5 degrees c and the next one and the previous one",
+ "type": "Composite1"
+ }
+ ],
+ "end": [
+ {
+ "length": 10,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "end",
+ "startIndex": 17,
+ "text": "3 days old",
+ "type": "builtin.age"
+ }
+ ],
+ "endpos": [
+ {
+ "length": 3,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "endpos",
+ "startIndex": 44,
+ "text": "3rd",
+ "type": "builtin.ordinalV2"
+ }
+ ],
+ "max": [
+ {
+ "length": 5,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "max",
+ "startIndex": 162,
+ "text": "$4.25",
+ "type": "builtin.currency"
+ }
+ ],
+ "ordinalV2": [
+ {
+ "length": 5,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 194,
+ "text": "first",
+ "type": "builtin.ordinalV2"
+ },
+ {
+ "length": 8,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 277,
+ "text": "next one",
+ "type": "builtin.ordinalV2.relative"
+ },
+ {
+ "length": 12,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 294,
+ "text": "previous one",
+ "type": "builtin.ordinalV2.relative"
+ }
+ ]
+ },
+ "begin": [
+ {
+ "number": 12,
+ "units": "Year"
+ }
+ ],
+ "Composite1": [
+ {
+ "$instance": {
+ "datetimeV2": [
+ {
+ "length": 8,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 0,
+ "text": "12 years",
+ "type": "builtin.datetimeV2.duration"
+ },
+ {
+ "length": 6,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 17,
+ "text": "3 days",
+ "type": "builtin.datetimeV2.duration"
+ },
+ {
+ "length": 21,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 32,
+ "text": "monday july 3rd, 2019",
+ "type": "builtin.datetimeV2.date"
+ },
+ {
+ "length": 12,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 58,
+ "text": "every monday",
+ "type": "builtin.datetimeV2.set"
+ },
+ {
+ "length": 22,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 75,
+ "text": "between 3am and 5:30am",
+ "type": "builtin.datetimeV2.timerange"
+ }
+ ],
+ "dimension": [
+ {
+ "length": 7,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 102,
+ "text": "4 acres",
+ "type": "builtin.dimension"
+ },
+ {
+ "length": 13,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 114,
+ "text": "4 pico meters",
+ "type": "builtin.dimension"
+ }
+ ],
+ "email": [
+ {
+ "length": 18,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 132,
+ "text": "chrimc@hotmail.com",
+ "type": "builtin.email"
+ }
+ ],
+ "money": [
+ {
+ "length": 2,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 155,
+ "text": "$4",
+ "type": "builtin.currency"
+ }
+ ],
+ "number": [
+ {
+ "length": 2,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 0,
+ "text": "12",
+ "type": "builtin.number"
+ },
+ {
+ "length": 1,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 17,
+ "text": "3",
+ "type": "builtin.number"
+ },
+ {
+ "length": 4,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 49,
+ "text": "2019",
+ "type": "builtin.number"
+ },
+ {
+ "length": 1,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 91,
+ "text": "5",
+ "type": "builtin.number"
+ },
+ {
+ "length": 1,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 102,
+ "text": "4",
+ "type": "builtin.number"
+ },
+ {
+ "length": 1,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 114,
+ "text": "4",
+ "type": "builtin.number"
+ },
+ {
+ "length": 1,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 156,
+ "text": "4",
+ "type": "builtin.number"
+ },
+ {
+ "length": 4,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 163,
+ "text": "4.25",
+ "type": "builtin.number"
+ },
+ {
+ "length": 2,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 177,
+ "text": "32",
+ "type": "builtin.number"
+ },
+ {
+ "length": 5,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 184,
+ "text": "210.4",
+ "type": "builtin.number"
+ },
+ {
+ "length": 2,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 204,
+ "text": "10",
+ "type": "builtin.number"
+ },
+ {
+ "length": 4,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 212,
+ "text": "10.5",
+ "type": "builtin.number"
+ },
+ {
+ "length": 3,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 222,
+ "text": "425",
+ "type": "builtin.number"
+ },
+ {
+ "length": 3,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 226,
+ "text": "555",
+ "type": "builtin.number"
+ },
+ {
+ "length": 4,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 230,
+ "text": "1234",
+ "type": "builtin.number"
+ },
+ {
+ "length": 1,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 239,
+ "text": "3",
+ "type": "builtin.number"
+ },
+ {
+ "length": 5,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 253,
+ "text": "-27.5",
+ "type": "builtin.number"
+ },
+ {
+ "length": 3,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 282,
+ "text": "one",
+ "type": "builtin.number"
+ },
+ {
+ "length": 3,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 303,
+ "text": "one",
+ "type": "builtin.number"
+ }
+ ],
+ "percentage": [
+ {
+ "length": 3,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 204,
+ "text": "10%",
+ "type": "builtin.percentage"
+ },
+ {
+ "length": 5,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 212,
+ "text": "10.5%",
+ "type": "builtin.percentage"
+ }
+ ],
+ "phonenumber": [
+ {
+ "length": 12,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "score": 0.9,
+ "startIndex": 222,
+ "text": "425-555-1234",
+ "type": "builtin.phonenumber"
+ }
+ ],
+ "temperature": [
+ {
+ "length": 9,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 239,
+ "text": "3 degrees",
+ "type": "builtin.temperature"
+ },
+ {
+ "length": 15,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 253,
+ "text": "-27.5 degrees c",
+ "type": "builtin.temperature"
+ }
+ ]
+ },
+ "datetimeV2": [
+ {
+ "type": "duration",
+ "values": [
+ {
+ "resolution": [
+ {
+ "value": "378432000"
+ }
+ ],
+ "timex": "P12Y"
+ }
+ ]
+ },
+ {
+ "type": "duration",
+ "values": [
+ {
+ "resolution": [
+ {
+ "value": "259200"
+ }
+ ],
+ "timex": "P3D"
+ }
+ ]
+ },
+ {
+ "type": "date",
+ "values": [
+ {
+ "resolution": [
+ {
+ "value": "2019-07-03"
+ }
+ ],
+ "timex": "2019-07-03"
+ }
+ ]
+ },
+ {
+ "type": "set",
+ "values": [
+ {
+ "resolution": [
+ {
+ "value": "not resolved"
+ }
+ ],
+ "timex": "XXXX-WXX-1"
+ }
+ ]
+ },
+ {
+ "type": "timerange",
+ "values": [
+ {
+ "resolution": [
+ {
+ "end": "05:30:00",
+ "start": "03:00:00"
+ }
+ ],
+ "timex": "(T03,T05:30,PT2H30M)"
+ }
+ ]
+ }
+ ],
+ "dimension": [
+ {
+ "number": 4,
+ "units": "Acre"
+ },
+ {
+ "number": 4,
+ "units": "Picometer"
+ }
+ ],
+ "email": [
+ "chrimc@hotmail.com"
+ ],
+ "money": [
+ {
+ "number": 4,
+ "units": "Dollar"
+ }
+ ],
+ "number": [
+ 12,
+ 3,
+ 2019,
+ 5,
+ 4,
+ 4,
+ 4,
+ 4.25,
+ 32,
+ 210.4,
+ 10,
+ 10.5,
+ 425,
+ 555,
+ 1234,
+ 3,
+ -27.5,
+ 1,
+ 1
+ ],
+ "percentage": [
+ 10,
+ 10.5
+ ],
+ "phonenumber": [
+ "425-555-1234"
+ ],
+ "temperature": [
+ {
+ "number": 3,
+ "units": "Degree"
+ },
+ {
+ "number": -27.5,
+ "units": "C"
+ }
+ ]
+ }
+ ],
+ "end": [
+ {
+ "number": 3,
+ "units": "Day"
+ }
+ ],
+ "endpos": [
+ {
+ "offset": 3,
+ "relativeTo": "start"
+ }
+ ],
+ "max": [
+ {
+ "number": 4.25,
+ "units": "Dollar"
+ }
+ ],
+ "ordinalV2": [
+ {
+ "offset": 1,
+ "relativeTo": "start"
+ },
+ {
+ "offset": 1,
+ "relativeTo": "current"
+ },
+ {
+ "offset": -1,
+ "relativeTo": "current"
+ }
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 1.54311692E-06
+ },
+ "Delivery": {
+ "score": 0.000280677923
+ },
+ "EntityTests": {
+ "score": 0.958614767
+ },
+ "Greeting": {
+ "score": 8.076372E-07
+ },
+ "Help": {
+ "score": 4.74059061E-06
+ },
+ "None": {
+ "score": 0.0101076821
+ },
+ "Roles": {
+ "score": 0.191202149
+ },
+ "search": {
+ "score": 0.00475360872
+ },
+ "SpecifyName": {
+ "score": 7.367716E-05
+ },
+ "Travel": {
+ "score": 0.00232480234
+ },
+ "Weather.GetForecast": {
+ "score": 0.0141556319
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "topIntent": "EntityTests"
+ },
+ "query": "12 years old and 3 days old and monday july 3rd, 2019 and every monday and between 3am and 5:30am and 4 acres and 4 pico meters and chrimc@hotmail.com and $4 and $4.25 and also 32 and 210.4 and first and 10% and 10.5% and 425-555-1234 and 3 degrees and -27.5 degrees c and the next one and the previous one"
+ }
+ }
+}
diff --git a/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/TypedPrebuilt.json b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/TypedPrebuilt.json
new file mode 100644
index 000000000..1ccad7581
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/TypedPrebuilt.json
@@ -0,0 +1,351 @@
+{
+ "entities": {
+ "$instance": {
+ "Composite2": [
+ {
+ "endIndex": 66,
+ "modelType": "Composite Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 0,
+ "text": "http://foo.com is where you can get a weather forecast for seattle",
+ "type": "Composite2"
+ }
+ ],
+ "geographyV2": [
+ {
+ "endIndex": 66,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 59,
+ "text": "seattle",
+ "type": "builtin.geographyV2.city"
+ }
+ ],
+ "oldURL": [
+ {
+ "endIndex": 14,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 0,
+ "text": "http://foo.com",
+ "type": "builtin.url"
+ }
+ ]
+ },
+ "Composite2": [
+ {
+ "$instance": {
+ "Weather_Location": [
+ {
+ "endIndex": 66,
+ "modelType": "Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 59,
+ "text": "seattle",
+ "type": "Weather.Location"
+ }
+ ]
+ },
+ "Weather_Location": [
+ "seattle"
+ ]
+ }
+ ],
+ "geographyV2": [
+ {
+ "location": "seattle",
+ "type": "city"
+ }
+ ],
+ "oldURL": [
+ "http://foo.com"
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 0.00017013021
+ },
+ "Delivery": {
+ "score": 0.00114031672
+ },
+ "EntityTests": {
+ "score": 0.286522
+ },
+ "Greeting": {
+ "score": 0.000150978623
+ },
+ "Help": {
+ "score": 0.000547617
+ },
+ "None": {
+ "score": 0.01798658
+ },
+ "Roles": {
+ "score": 0.0459664278
+ },
+ "search": {
+ "score": 0.0009428267
+ },
+ "SpecifyName": {
+ "score": 0.0009960134
+ },
+ "Travel": {
+ "score": 0.00235179346
+ },
+ "Weather_GetForecast": {
+ "score": 0.6732952
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "text": "http://foo.com is where you can get a weather forecast for seattle",
+ "v2": {
+ "options": {
+ "IncludeAllIntents": true,
+ "IncludeInstanceData": true,
+ "LogPersonalInformation": false,
+ "Timeout": 100000.0
+ },
+ "response": {
+ "compositeEntities": [
+ {
+ "children": [
+ {
+ "type": "Weather.Location",
+ "value": "seattle"
+ }
+ ],
+ "parentType": "Composite2",
+ "value": "http : / / foo . com is where you can get a weather forecast for seattle"
+ }
+ ],
+ "entities": [
+ {
+ "endIndex": 65,
+ "entity": "seattle",
+ "score": 0.8245291,
+ "startIndex": 59,
+ "type": "Weather.Location"
+ },
+ {
+ "endIndex": 65,
+ "entity": "http : / / foo . com is where you can get a weather forecast for seattle",
+ "score": 0.6503277,
+ "startIndex": 0,
+ "type": "Composite2"
+ },
+ {
+ "endIndex": 65,
+ "entity": "seattle",
+ "startIndex": 59,
+ "type": "builtin.geographyV2.city"
+ },
+ {
+ "endIndex": 13,
+ "entity": "http://foo.com",
+ "resolution": {
+ "value": "http://foo.com"
+ },
+ "role": "oldURL",
+ "startIndex": 0,
+ "type": "builtin.url"
+ }
+ ],
+ "intents": [
+ {
+ "intent": "Weather.GetForecast",
+ "score": 0.6732952
+ },
+ {
+ "intent": "EntityTests",
+ "score": 0.286522
+ },
+ {
+ "intent": "Roles",
+ "score": 0.0459664278
+ },
+ {
+ "intent": "None",
+ "score": 0.01798658
+ },
+ {
+ "intent": "Travel",
+ "score": 0.00235179346
+ },
+ {
+ "intent": "Delivery",
+ "score": 0.00114031672
+ },
+ {
+ "intent": "SpecifyName",
+ "score": 0.0009960134
+ },
+ {
+ "intent": "search",
+ "score": 0.0009428267
+ },
+ {
+ "intent": "Help",
+ "score": 0.000547617
+ },
+ {
+ "intent": "Cancel",
+ "score": 0.00017013021
+ },
+ {
+ "intent": "Greeting",
+ "score": 0.000150978623
+ }
+ ],
+ "query": "http://foo.com is where you can get a weather forecast for seattle",
+ "sentimentAnalysis": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "topScoringIntent": {
+ "intent": "Weather.GetForecast",
+ "score": 0.6732952
+ }
+ }
+ },
+ "v3": {
+ "options": {
+ "IncludeAllIntents": true,
+ "IncludeAPIResults": true,
+ "IncludeInstanceData": true,
+ "Log": true,
+ "PreferExternalEntities": true,
+ "Slot": "production"
+ },
+ "response": {
+ "prediction": {
+ "entities": {
+ "$instance": {
+ "Composite2": [
+ {
+ "length": 66,
+ "modelType": "Composite Entity Extractor",
+ "modelTypeId": 4,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 0,
+ "text": "http://foo.com is where you can get a weather forecast for seattle",
+ "type": "Composite2"
+ }
+ ],
+ "geographyV2": [
+ {
+ "length": 7,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 59,
+ "text": "seattle",
+ "type": "builtin.geographyV2.city"
+ }
+ ],
+ "oldURL": [
+ {
+ "length": 14,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "oldURL",
+ "startIndex": 0,
+ "text": "http://foo.com",
+ "type": "builtin.url"
+ }
+ ]
+ },
+ "Composite2": [
+ {
+ "$instance": {
+ "Weather.Location": [
+ {
+ "length": 7,
+ "modelType": "Entity Extractor",
+ "modelTypeId": 1,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 59,
+ "text": "seattle",
+ "type": "Weather.Location"
+ }
+ ]
+ },
+ "Weather.Location": [
+ "seattle"
+ ]
+ }
+ ],
+ "geographyV2": [
+ {
+ "type": "city",
+ "value": "seattle"
+ }
+ ],
+ "oldURL": [
+ "http://foo.com"
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 0.00017013021
+ },
+ "Delivery": {
+ "score": 0.00114031672
+ },
+ "EntityTests": {
+ "score": 0.286522
+ },
+ "Greeting": {
+ "score": 0.000150978623
+ },
+ "Help": {
+ "score": 0.000547617
+ },
+ "None": {
+ "score": 0.01798658
+ },
+ "Roles": {
+ "score": 0.0459664278
+ },
+ "search": {
+ "score": 0.0009428267
+ },
+ "SpecifyName": {
+ "score": 0.0009960134
+ },
+ "Travel": {
+ "score": 0.00235179346
+ },
+ "Weather.GetForecast": {
+ "score": 0.6732952
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "topIntent": "Weather.GetForecast"
+ },
+ "query": "http://foo.com is where you can get a weather forecast for seattle"
+ }
+ }
+}
diff --git a/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/V1DatetimeResolution.json b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/V1DatetimeResolution.json
new file mode 100644
index 000000000..eb662c3ff
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/V1DatetimeResolution.json
@@ -0,0 +1,19 @@
+{
+ "query": "4",
+ "topScoringIntent": {
+ "intent": "None",
+ "score": 0.8575135
+ },
+ "entities": [
+ {
+ "entity": "4",
+ "type": "builtin.datetime.time",
+ "startIndex": 0,
+ "endIndex": 0,
+ "resolution": {
+ "comment": "ampm",
+ "time": "T04"
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/roles.json b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/roles.json
new file mode 100644
index 000000000..adb7c1fa6
--- /dev/null
+++ b/libraries/bot-ai-luis-v3/src/test/java/com/microsoft/bot/ai/luis/testdata/roles.json
@@ -0,0 +1,2252 @@
+{
+ "entities": {
+ "$instance": {
+ "a": [
+ {
+ "endIndex": 309,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 299,
+ "text": "68 degrees",
+ "type": "builtin.temperature"
+ }
+ ],
+ "arrive": [
+ {
+ "endIndex": 373,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 370,
+ "text": "5pm",
+ "type": "builtin.datetimeV2.time"
+ }
+ ],
+ "b": [
+ {
+ "endIndex": 324,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 314,
+ "text": "72 degrees",
+ "type": "builtin.temperature"
+ }
+ ],
+ "begin": [
+ {
+ "endIndex": 76,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 65,
+ "text": "6 years old",
+ "type": "builtin.age"
+ }
+ ],
+ "buy": [
+ {
+ "endIndex": 124,
+ "modelType": "Regex Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 119,
+ "text": "kb922",
+ "type": "Part"
+ }
+ ],
+ "Buyer": [
+ {
+ "endIndex": 178,
+ "modelType": "List Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 173,
+ "text": "delta",
+ "type": "Airline"
+ }
+ ],
+ "datetime": [
+ {
+ "endIndex": 72,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 65,
+ "text": "6 years",
+ "type": "builtin.datetimeV2.duration"
+ },
+ {
+ "endIndex": 88,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 81,
+ "text": "8 years",
+ "type": "builtin.datetimeV2.duration"
+ }
+ ],
+ "destination": [
+ {
+ "endIndex": 233,
+ "modelType": "Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 226,
+ "text": "redmond",
+ "type": "Weather.Location"
+ }
+ ],
+ "dimension": [
+ {
+ "endIndex": 358,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 355,
+ "text": "3pm",
+ "type": "builtin.dimension"
+ },
+ {
+ "endIndex": 373,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 370,
+ "text": "5pm",
+ "type": "builtin.dimension"
+ }
+ ],
+ "end": [
+ {
+ "endIndex": 92,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 81,
+ "text": "8 years old",
+ "type": "builtin.age"
+ }
+ ],
+ "geographyV2": [
+ {
+ "endIndex": 218,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 212,
+ "text": "hawaii",
+ "type": "builtin.geographyV2.state"
+ },
+ {
+ "endIndex": 233,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 226,
+ "text": "redmond",
+ "type": "builtin.geographyV2.city"
+ }
+ ],
+ "leave": [
+ {
+ "endIndex": 358,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 355,
+ "text": "3pm",
+ "type": "builtin.datetimeV2.time"
+ }
+ ],
+ "length": [
+ {
+ "endIndex": 8,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 0,
+ "text": "3 inches",
+ "type": "builtin.dimension"
+ }
+ ],
+ "likee": [
+ {
+ "endIndex": 344,
+ "modelType": "Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 340,
+ "text": "mary",
+ "type": "Name"
+ }
+ ],
+ "liker": [
+ {
+ "endIndex": 333,
+ "modelType": "Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 329,
+ "text": "john",
+ "type": "Name"
+ }
+ ],
+ "max": [
+ {
+ "endIndex": 403,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 399,
+ "text": "$500",
+ "type": "builtin.currency"
+ }
+ ],
+ "maximum": [
+ {
+ "endIndex": 44,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 41,
+ "text": "10%",
+ "type": "builtin.percentage"
+ }
+ ],
+ "min": [
+ {
+ "endIndex": 394,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 390,
+ "text": "$400",
+ "type": "builtin.currency"
+ }
+ ],
+ "minimum": [
+ {
+ "endIndex": 37,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 35,
+ "text": "5%",
+ "type": "builtin.percentage"
+ }
+ ],
+ "newPhone": [
+ {
+ "endIndex": 164,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "score": 0.9,
+ "startIndex": 152,
+ "text": "206-666-4123",
+ "type": "builtin.phonenumber"
+ }
+ ],
+ "number": [
+ {
+ "endIndex": 1,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 0,
+ "text": "3",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 18,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 17,
+ "text": "2",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 36,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 35,
+ "text": "5",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 43,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 41,
+ "text": "10",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 66,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 65,
+ "text": "6",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 82,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 81,
+ "text": "8",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 139,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 136,
+ "text": "425",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 143,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 140,
+ "text": "777",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 148,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 144,
+ "text": "1212",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 155,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 152,
+ "text": "206",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 159,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 156,
+ "text": "666",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 164,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 160,
+ "text": "4123",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 301,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 299,
+ "text": "68",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 316,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 314,
+ "text": "72",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 394,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 391,
+ "text": "400",
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 403,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 400,
+ "text": "500",
+ "type": "builtin.number"
+ }
+ ],
+ "old": [
+ {
+ "endIndex": 148,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "score": 0.9,
+ "startIndex": 136,
+ "text": "425-777-1212",
+ "type": "builtin.phonenumber"
+ }
+ ],
+ "oldURL": [
+ {
+ "endIndex": 252,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 238,
+ "text": "http://foo.com",
+ "type": "builtin.url"
+ }
+ ],
+ "personName": [
+ {
+ "endIndex": 333,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 329,
+ "text": "john",
+ "type": "builtin.personName"
+ },
+ {
+ "endIndex": 344,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 340,
+ "text": "mary",
+ "type": "builtin.personName"
+ }
+ ],
+ "receiver": [
+ {
+ "endIndex": 431,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 413,
+ "text": "chrimc@hotmail.com",
+ "type": "builtin.email"
+ }
+ ],
+ "sell": [
+ {
+ "endIndex": 114,
+ "modelType": "Regex Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 109,
+ "text": "kb457",
+ "type": "Part"
+ }
+ ],
+ "Seller": [
+ {
+ "endIndex": 189,
+ "modelType": "List Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 183,
+ "text": "virgin",
+ "type": "Airline"
+ }
+ ],
+ "sender": [
+ {
+ "endIndex": 451,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 437,
+ "text": "emad@gmail.com",
+ "type": "builtin.email"
+ }
+ ],
+ "source": [
+ {
+ "endIndex": 218,
+ "modelType": "Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 212,
+ "text": "hawaii",
+ "type": "Weather.Location"
+ }
+ ],
+ "url": [
+ {
+ "endIndex": 279,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 264,
+ "text": "http://blah.com",
+ "type": "builtin.url"
+ }
+ ],
+ "width": [
+ {
+ "endIndex": 25,
+ "modelType": "Prebuilt Entity Extractor",
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 17,
+ "text": "2 inches",
+ "type": "builtin.dimension"
+ }
+ ]
+ },
+ "a": [
+ {
+ "number": 68,
+ "units": "Degree"
+ }
+ ],
+ "arrive": [
+ {
+ "timex": [
+ "T17"
+ ],
+ "type": "time"
+ }
+ ],
+ "b": [
+ {
+ "number": 72,
+ "units": "Degree"
+ }
+ ],
+ "begin": [
+ {
+ "number": 6,
+ "units": "Year"
+ }
+ ],
+ "buy": [
+ "kb922"
+ ],
+ "Buyer": [
+ [
+ "Delta"
+ ]
+ ],
+ "datetime": [
+ {
+ "timex": [
+ "P6Y"
+ ],
+ "type": "duration"
+ },
+ {
+ "timex": [
+ "P8Y"
+ ],
+ "type": "duration"
+ }
+ ],
+ "destination": [
+ "redmond"
+ ],
+ "dimension": [
+ {
+ "number": 3,
+ "units": "Picometer"
+ },
+ {
+ "number": 5,
+ "units": "Picometer"
+ }
+ ],
+ "end": [
+ {
+ "number": 8,
+ "units": "Year"
+ }
+ ],
+ "geographyV2": [
+ {
+ "location": "hawaii",
+ "type": "state"
+ },
+ {
+ "location": "redmond",
+ "type": "city"
+ }
+ ],
+ "leave": [
+ {
+ "timex": [
+ "T15"
+ ],
+ "type": "time"
+ }
+ ],
+ "length": [
+ {
+ "number": 3,
+ "units": "Inch"
+ }
+ ],
+ "likee": [
+ "mary"
+ ],
+ "liker": [
+ "john"
+ ],
+ "max": [
+ {
+ "number": 500,
+ "units": "Dollar"
+ }
+ ],
+ "maximum": [
+ 10
+ ],
+ "min": [
+ {
+ "number": 400,
+ "units": "Dollar"
+ }
+ ],
+ "minimum": [
+ 5
+ ],
+ "newPhone": [
+ "206-666-4123"
+ ],
+ "number": [
+ 3,
+ 2,
+ 5,
+ 10,
+ 6,
+ 8,
+ 425,
+ 777,
+ 1212,
+ 206,
+ 666,
+ 4123,
+ 68,
+ 72,
+ 400,
+ 500
+ ],
+ "old": [
+ "425-777-1212"
+ ],
+ "oldURL": [
+ "http://foo.com"
+ ],
+ "personName": [
+ "john",
+ "mary"
+ ],
+ "receiver": [
+ "chrimc@hotmail.com"
+ ],
+ "sell": [
+ "kb457"
+ ],
+ "Seller": [
+ [
+ "Virgin"
+ ]
+ ],
+ "sender": [
+ "emad@gmail.com"
+ ],
+ "source": [
+ "hawaii"
+ ],
+ "url": [
+ "http://blah.com"
+ ],
+ "width": [
+ {
+ "number": 2,
+ "units": "Inch"
+ }
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 4.48137826E-07
+ },
+ "Delivery": {
+ "score": 7.920229E-05
+ },
+ "EntityTests": {
+ "score": 0.00420103827
+ },
+ "Greeting": {
+ "score": 4.6571725E-07
+ },
+ "Help": {
+ "score": 7.5179554E-07
+ },
+ "None": {
+ "score": 0.0009303715
+ },
+ "Roles": {
+ "score": 1.0
+ },
+ "search": {
+ "score": 0.00245359377
+ },
+ "SpecifyName": {
+ "score": 5.62756977E-05
+ },
+ "Travel": {
+ "score": 0.002153493
+ },
+ "Weather_GetForecast": {
+ "score": 0.0100878729
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "text": "3 inches long by 2 inches wide and 5% to 10% and are you between 6 years old and 8 years old and can i trade kb457 for kb922 and change 425-777-1212 to 206-666-4123 and did delta buy virgin and did the rain from hawaii get to redmond and http://foo.com changed to http://blah.com and i like between 68 degrees and 72 degrees and john likes mary and leave 3pm and arrive 5pm and pay between $400 and $500 and send chrimc@hotmail.com from emad@gmail.com",
+ "v2": {
+ "options": {
+ "IncludeAllIntents": true,
+ "IncludeInstanceData": true,
+ "LogPersonalInformation": false,
+ "Timeout": 100000.0
+ },
+ "response": {
+ "entities": [
+ {
+ "endIndex": 332,
+ "entity": "john",
+ "role": "liker",
+ "score": 0.991758049,
+ "startIndex": 329,
+ "type": "Name"
+ },
+ {
+ "endIndex": 343,
+ "entity": "mary",
+ "role": "likee",
+ "score": 0.995282352,
+ "startIndex": 340,
+ "type": "Name"
+ },
+ {
+ "endIndex": 217,
+ "entity": "hawaii",
+ "role": "source",
+ "score": 0.985036731,
+ "startIndex": 212,
+ "type": "Weather.Location"
+ },
+ {
+ "endIndex": 232,
+ "entity": "redmond",
+ "role": "destination",
+ "score": 0.989005446,
+ "startIndex": 226,
+ "type": "Weather.Location"
+ },
+ {
+ "endIndex": 0,
+ "entity": "3",
+ "resolution": {
+ "subtype": "integer",
+ "value": "3"
+ },
+ "startIndex": 0,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 17,
+ "entity": "2",
+ "resolution": {
+ "subtype": "integer",
+ "value": "2"
+ },
+ "startIndex": 17,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 35,
+ "entity": "5",
+ "resolution": {
+ "subtype": "integer",
+ "value": "5"
+ },
+ "startIndex": 35,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 42,
+ "entity": "10",
+ "resolution": {
+ "subtype": "integer",
+ "value": "10"
+ },
+ "startIndex": 41,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 65,
+ "entity": "6",
+ "resolution": {
+ "subtype": "integer",
+ "value": "6"
+ },
+ "startIndex": 65,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 81,
+ "entity": "8",
+ "resolution": {
+ "subtype": "integer",
+ "value": "8"
+ },
+ "startIndex": 81,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 138,
+ "entity": "425",
+ "resolution": {
+ "subtype": "integer",
+ "value": "425"
+ },
+ "startIndex": 136,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 142,
+ "entity": "777",
+ "resolution": {
+ "subtype": "integer",
+ "value": "777"
+ },
+ "startIndex": 140,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 147,
+ "entity": "1212",
+ "resolution": {
+ "subtype": "integer",
+ "value": "1212"
+ },
+ "startIndex": 144,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 154,
+ "entity": "206",
+ "resolution": {
+ "subtype": "integer",
+ "value": "206"
+ },
+ "startIndex": 152,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 158,
+ "entity": "666",
+ "resolution": {
+ "subtype": "integer",
+ "value": "666"
+ },
+ "startIndex": 156,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 163,
+ "entity": "4123",
+ "resolution": {
+ "subtype": "integer",
+ "value": "4123"
+ },
+ "startIndex": 160,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 300,
+ "entity": "68",
+ "resolution": {
+ "subtype": "integer",
+ "value": "68"
+ },
+ "startIndex": 299,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 315,
+ "entity": "72",
+ "resolution": {
+ "subtype": "integer",
+ "value": "72"
+ },
+ "startIndex": 314,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 393,
+ "entity": "400",
+ "resolution": {
+ "subtype": "integer",
+ "value": "400"
+ },
+ "startIndex": 391,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 402,
+ "entity": "500",
+ "resolution": {
+ "subtype": "integer",
+ "value": "500"
+ },
+ "startIndex": 400,
+ "type": "builtin.number"
+ },
+ {
+ "endIndex": 75,
+ "entity": "6 years old",
+ "resolution": {
+ "unit": "Year",
+ "value": "6"
+ },
+ "role": "begin",
+ "startIndex": 65,
+ "type": "builtin.age"
+ },
+ {
+ "endIndex": 91,
+ "entity": "8 years old",
+ "resolution": {
+ "unit": "Year",
+ "value": "8"
+ },
+ "role": "end",
+ "startIndex": 81,
+ "type": "builtin.age"
+ },
+ {
+ "endIndex": 71,
+ "entity": "6 years",
+ "resolution": {
+ "values": [
+ {
+ "timex": "P6Y",
+ "type": "duration",
+ "value": "189216000"
+ }
+ ]
+ },
+ "startIndex": 65,
+ "type": "builtin.datetimeV2.duration"
+ },
+ {
+ "endIndex": 87,
+ "entity": "8 years",
+ "resolution": {
+ "values": [
+ {
+ "timex": "P8Y",
+ "type": "duration",
+ "value": "252288000"
+ }
+ ]
+ },
+ "startIndex": 81,
+ "type": "builtin.datetimeV2.duration"
+ },
+ {
+ "endIndex": 357,
+ "entity": "3pm",
+ "resolution": {
+ "values": [
+ {
+ "timex": "T15",
+ "type": "time",
+ "value": "15:00:00"
+ }
+ ]
+ },
+ "role": "leave",
+ "startIndex": 355,
+ "type": "builtin.datetimeV2.time"
+ },
+ {
+ "endIndex": 372,
+ "entity": "5pm",
+ "resolution": {
+ "values": [
+ {
+ "timex": "T17",
+ "type": "time",
+ "value": "17:00:00"
+ }
+ ]
+ },
+ "role": "arrive",
+ "startIndex": 370,
+ "type": "builtin.datetimeV2.time"
+ },
+ {
+ "endIndex": 7,
+ "entity": "3 inches",
+ "resolution": {
+ "unit": "Inch",
+ "value": "3"
+ },
+ "role": "length",
+ "startIndex": 0,
+ "type": "builtin.dimension"
+ },
+ {
+ "endIndex": 24,
+ "entity": "2 inches",
+ "resolution": {
+ "unit": "Inch",
+ "value": "2"
+ },
+ "role": "width",
+ "startIndex": 17,
+ "type": "builtin.dimension"
+ },
+ {
+ "endIndex": 357,
+ "entity": "3pm",
+ "resolution": {
+ "unit": "Picometer",
+ "value": "3"
+ },
+ "startIndex": 355,
+ "type": "builtin.dimension"
+ },
+ {
+ "endIndex": 372,
+ "entity": "5pm",
+ "resolution": {
+ "unit": "Picometer",
+ "value": "5"
+ },
+ "startIndex": 370,
+ "type": "builtin.dimension"
+ },
+ {
+ "endIndex": 430,
+ "entity": "chrimc@hotmail.com",
+ "resolution": {
+ "value": "chrimc@hotmail.com"
+ },
+ "role": "receiver",
+ "startIndex": 413,
+ "type": "builtin.email"
+ },
+ {
+ "endIndex": 450,
+ "entity": "emad@gmail.com",
+ "resolution": {
+ "value": "emad@gmail.com"
+ },
+ "role": "sender",
+ "startIndex": 437,
+ "type": "builtin.email"
+ },
+ {
+ "endIndex": 217,
+ "entity": "hawaii",
+ "startIndex": 212,
+ "type": "builtin.geographyV2.state"
+ },
+ {
+ "endIndex": 232,
+ "entity": "redmond",
+ "startIndex": 226,
+ "type": "builtin.geographyV2.city"
+ },
+ {
+ "endIndex": 393,
+ "entity": "$400",
+ "resolution": {
+ "unit": "Dollar",
+ "value": "400"
+ },
+ "role": "min",
+ "startIndex": 390,
+ "type": "builtin.currency"
+ },
+ {
+ "endIndex": 402,
+ "entity": "$500",
+ "resolution": {
+ "unit": "Dollar",
+ "value": "500"
+ },
+ "role": "max",
+ "startIndex": 399,
+ "type": "builtin.currency"
+ },
+ {
+ "endIndex": 36,
+ "entity": "5%",
+ "resolution": {
+ "value": "5%"
+ },
+ "role": "minimum",
+ "startIndex": 35,
+ "type": "builtin.percentage"
+ },
+ {
+ "endIndex": 43,
+ "entity": "10%",
+ "resolution": {
+ "value": "10%"
+ },
+ "role": "maximum",
+ "startIndex": 41,
+ "type": "builtin.percentage"
+ },
+ {
+ "endIndex": 332,
+ "entity": "john",
+ "startIndex": 329,
+ "type": "builtin.personName"
+ },
+ {
+ "endIndex": 343,
+ "entity": "mary",
+ "startIndex": 340,
+ "type": "builtin.personName"
+ },
+ {
+ "endIndex": 147,
+ "entity": "425-777-1212",
+ "resolution": {
+ "score": "0.9",
+ "value": "425-777-1212"
+ },
+ "role": "old",
+ "startIndex": 136,
+ "type": "builtin.phonenumber"
+ },
+ {
+ "endIndex": 163,
+ "entity": "206-666-4123",
+ "resolution": {
+ "score": "0.9",
+ "value": "206-666-4123"
+ },
+ "role": "newPhone",
+ "startIndex": 152,
+ "type": "builtin.phonenumber"
+ },
+ {
+ "endIndex": 308,
+ "entity": "68 degrees",
+ "resolution": {
+ "unit": "Degree",
+ "value": "68"
+ },
+ "role": "a",
+ "startIndex": 299,
+ "type": "builtin.temperature"
+ },
+ {
+ "endIndex": 323,
+ "entity": "72 degrees",
+ "resolution": {
+ "unit": "Degree",
+ "value": "72"
+ },
+ "role": "b",
+ "startIndex": 314,
+ "type": "builtin.temperature"
+ },
+ {
+ "endIndex": 251,
+ "entity": "http://foo.com",
+ "resolution": {
+ "value": "http://foo.com"
+ },
+ "role": "oldURL",
+ "startIndex": 238,
+ "type": "builtin.url"
+ },
+ {
+ "endIndex": 278,
+ "entity": "http://blah.com",
+ "resolution": {
+ "value": "http://blah.com"
+ },
+ "startIndex": 264,
+ "type": "builtin.url"
+ },
+ {
+ "endIndex": 177,
+ "entity": "delta",
+ "resolution": {
+ "values": [
+ "Delta"
+ ]
+ },
+ "role": "Buyer",
+ "startIndex": 173,
+ "type": "Airline"
+ },
+ {
+ "endIndex": 188,
+ "entity": "virgin",
+ "resolution": {
+ "values": [
+ "Virgin"
+ ]
+ },
+ "role": "Seller",
+ "startIndex": 183,
+ "type": "Airline"
+ },
+ {
+ "endIndex": 113,
+ "entity": "kb457",
+ "role": "sell",
+ "startIndex": 109,
+ "type": "Part"
+ },
+ {
+ "endIndex": 123,
+ "entity": "kb922",
+ "role": "buy",
+ "startIndex": 119,
+ "type": "Part"
+ }
+ ],
+ "intents": [
+ {
+ "intent": "Roles",
+ "score": 1.0
+ },
+ {
+ "intent": "Weather.GetForecast",
+ "score": 0.0100878729
+ },
+ {
+ "intent": "EntityTests",
+ "score": 0.00420103827
+ },
+ {
+ "intent": "search",
+ "score": 0.00245359377
+ },
+ {
+ "intent": "Travel",
+ "score": 0.002153493
+ },
+ {
+ "intent": "None",
+ "score": 0.0009303715
+ },
+ {
+ "intent": "Delivery",
+ "score": 7.920229E-05
+ },
+ {
+ "intent": "SpecifyName",
+ "score": 5.62756977E-05
+ },
+ {
+ "intent": "Help",
+ "score": 7.5179554E-07
+ },
+ {
+ "intent": "Greeting",
+ "score": 4.6571725E-07
+ },
+ {
+ "intent": "Cancel",
+ "score": 4.48137826E-07
+ }
+ ],
+ "query": "3 inches long by 2 inches wide and 5% to 10% and are you between 6 years old and 8 years old and can i trade kb457 for kb922 and change 425-777-1212 to 206-666-4123 and did delta buy virgin and did the rain from hawaii get to redmond and http://foo.com changed to http://blah.com and i like between 68 degrees and 72 degrees and john likes mary and leave 3pm and arrive 5pm and pay between $400 and $500 and send chrimc@hotmail.com from emad@gmail.com",
+ "sentimentAnalysis": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "topScoringIntent": {
+ "intent": "Roles",
+ "score": 1.0
+ }
+ }
+ },
+ "v3": {
+ "options": {
+ "IncludeAllIntents": true,
+ "IncludeAPIResults": true,
+ "IncludeInstanceData": true,
+ "Log": true,
+ "PreferExternalEntities": true,
+ "Slot": "production"
+ },
+ "response": {
+ "prediction": {
+ "entities": {
+ "$instance": {
+ "a": [
+ {
+ "length": 10,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "a",
+ "startIndex": 299,
+ "text": "68 degrees",
+ "type": "builtin.temperature"
+ }
+ ],
+ "arrive": [
+ {
+ "length": 3,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "arrive",
+ "startIndex": 370,
+ "text": "5pm",
+ "type": "builtin.datetimeV2.time"
+ }
+ ],
+ "b": [
+ {
+ "length": 10,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "b",
+ "startIndex": 314,
+ "text": "72 degrees",
+ "type": "builtin.temperature"
+ }
+ ],
+ "begin": [
+ {
+ "length": 11,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "begin",
+ "startIndex": 65,
+ "text": "6 years old",
+ "type": "builtin.age"
+ }
+ ],
+ "buy": [
+ {
+ "length": 5,
+ "modelType": "Regex Entity Extractor",
+ "modelTypeId": 8,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "buy",
+ "startIndex": 119,
+ "text": "kb922",
+ "type": "Part"
+ }
+ ],
+ "Buyer": [
+ {
+ "length": 5,
+ "modelType": "List Entity Extractor",
+ "modelTypeId": 5,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "Buyer",
+ "startIndex": 173,
+ "text": "delta",
+ "type": "Airline"
+ }
+ ],
+ "datetimeV2": [
+ {
+ "length": 7,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 65,
+ "text": "6 years",
+ "type": "builtin.datetimeV2.duration"
+ },
+ {
+ "length": 7,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 81,
+ "text": "8 years",
+ "type": "builtin.datetimeV2.duration"
+ }
+ ],
+ "destination": [
+ {
+ "length": 7,
+ "modelType": "Entity Extractor",
+ "modelTypeId": 1,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "destination",
+ "startIndex": 226,
+ "text": "redmond",
+ "type": "Weather.Location"
+ }
+ ],
+ "dimension": [
+ {
+ "length": 3,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 355,
+ "text": "3pm",
+ "type": "builtin.dimension"
+ },
+ {
+ "length": 3,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 370,
+ "text": "5pm",
+ "type": "builtin.dimension"
+ }
+ ],
+ "end": [
+ {
+ "length": 11,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "end",
+ "startIndex": 81,
+ "text": "8 years old",
+ "type": "builtin.age"
+ }
+ ],
+ "geographyV2": [
+ {
+ "length": 6,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 212,
+ "text": "hawaii",
+ "type": "builtin.geographyV2.state"
+ },
+ {
+ "length": 7,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 226,
+ "text": "redmond",
+ "type": "builtin.geographyV2.city"
+ }
+ ],
+ "leave": [
+ {
+ "length": 3,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "leave",
+ "startIndex": 355,
+ "text": "3pm",
+ "type": "builtin.datetimeV2.time"
+ }
+ ],
+ "length": [
+ {
+ "length": 8,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "length",
+ "startIndex": 0,
+ "text": "3 inches",
+ "type": "builtin.dimension"
+ }
+ ],
+ "likee": [
+ {
+ "length": 4,
+ "modelType": "Entity Extractor",
+ "modelTypeId": 1,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "likee",
+ "startIndex": 340,
+ "text": "mary",
+ "type": "Name"
+ }
+ ],
+ "liker": [
+ {
+ "length": 4,
+ "modelType": "Entity Extractor",
+ "modelTypeId": 1,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "liker",
+ "startIndex": 329,
+ "text": "john",
+ "type": "Name"
+ }
+ ],
+ "max": [
+ {
+ "length": 4,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "max",
+ "startIndex": 399,
+ "text": "$500",
+ "type": "builtin.currency"
+ }
+ ],
+ "maximum": [
+ {
+ "length": 3,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "maximum",
+ "startIndex": 41,
+ "text": "10%",
+ "type": "builtin.percentage"
+ }
+ ],
+ "min": [
+ {
+ "length": 4,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "min",
+ "startIndex": 390,
+ "text": "$400",
+ "type": "builtin.currency"
+ }
+ ],
+ "minimum": [
+ {
+ "length": 2,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "minimum",
+ "startIndex": 35,
+ "text": "5%",
+ "type": "builtin.percentage"
+ }
+ ],
+ "newPhone": [
+ {
+ "length": 12,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "newPhone",
+ "score": 0.9,
+ "startIndex": 152,
+ "text": "206-666-4123",
+ "type": "builtin.phonenumber"
+ }
+ ],
+ "number": [
+ {
+ "length": 1,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 0,
+ "text": "3",
+ "type": "builtin.number"
+ },
+ {
+ "length": 1,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 17,
+ "text": "2",
+ "type": "builtin.number"
+ },
+ {
+ "length": 1,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 35,
+ "text": "5",
+ "type": "builtin.number"
+ },
+ {
+ "length": 2,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 41,
+ "text": "10",
+ "type": "builtin.number"
+ },
+ {
+ "length": 1,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 65,
+ "text": "6",
+ "type": "builtin.number"
+ },
+ {
+ "length": 1,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 81,
+ "text": "8",
+ "type": "builtin.number"
+ },
+ {
+ "length": 3,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 136,
+ "text": "425",
+ "type": "builtin.number"
+ },
+ {
+ "length": 3,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 140,
+ "text": "777",
+ "type": "builtin.number"
+ },
+ {
+ "length": 4,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 144,
+ "text": "1212",
+ "type": "builtin.number"
+ },
+ {
+ "length": 3,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 152,
+ "text": "206",
+ "type": "builtin.number"
+ },
+ {
+ "length": 3,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 156,
+ "text": "666",
+ "type": "builtin.number"
+ },
+ {
+ "length": 4,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 160,
+ "text": "4123",
+ "type": "builtin.number"
+ },
+ {
+ "length": 2,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 299,
+ "text": "68",
+ "type": "builtin.number"
+ },
+ {
+ "length": 2,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 314,
+ "text": "72",
+ "type": "builtin.number"
+ },
+ {
+ "length": 3,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 391,
+ "text": "400",
+ "type": "builtin.number"
+ },
+ {
+ "length": 3,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 400,
+ "text": "500",
+ "type": "builtin.number"
+ }
+ ],
+ "old": [
+ {
+ "length": 12,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "old",
+ "score": 0.9,
+ "startIndex": 136,
+ "text": "425-777-1212",
+ "type": "builtin.phonenumber"
+ }
+ ],
+ "oldURL": [
+ {
+ "length": 14,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "oldURL",
+ "startIndex": 238,
+ "text": "http://foo.com",
+ "type": "builtin.url"
+ }
+ ],
+ "personName": [
+ {
+ "length": 4,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 329,
+ "text": "john",
+ "type": "builtin.personName"
+ },
+ {
+ "length": 4,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 340,
+ "text": "mary",
+ "type": "builtin.personName"
+ }
+ ],
+ "receiver": [
+ {
+ "length": 18,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "receiver",
+ "startIndex": 413,
+ "text": "chrimc@hotmail.com",
+ "type": "builtin.email"
+ }
+ ],
+ "sell": [
+ {
+ "length": 5,
+ "modelType": "Regex Entity Extractor",
+ "modelTypeId": 8,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "sell",
+ "startIndex": 109,
+ "text": "kb457",
+ "type": "Part"
+ }
+ ],
+ "Seller": [
+ {
+ "length": 6,
+ "modelType": "List Entity Extractor",
+ "modelTypeId": 5,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "Seller",
+ "startIndex": 183,
+ "text": "virgin",
+ "type": "Airline"
+ }
+ ],
+ "sender": [
+ {
+ "length": 14,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "sender",
+ "startIndex": 437,
+ "text": "emad@gmail.com",
+ "type": "builtin.email"
+ }
+ ],
+ "source": [
+ {
+ "length": 6,
+ "modelType": "Entity Extractor",
+ "modelTypeId": 1,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "source",
+ "startIndex": 212,
+ "text": "hawaii",
+ "type": "Weather.Location"
+ }
+ ],
+ "url": [
+ {
+ "length": 15,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "startIndex": 264,
+ "text": "http://blah.com",
+ "type": "builtin.url"
+ }
+ ],
+ "width": [
+ {
+ "length": 8,
+ "modelType": "Prebuilt Entity Extractor",
+ "modelTypeId": 2,
+ "recognitionSources": [
+ "model"
+ ],
+ "role": "width",
+ "startIndex": 17,
+ "text": "2 inches",
+ "type": "builtin.dimension"
+ }
+ ]
+ },
+ "a": [
+ {
+ "number": 68,
+ "units": "Degree"
+ }
+ ],
+ "arrive": [
+ {
+ "type": "time",
+ "values": [
+ {
+ "resolution": [
+ {
+ "value": "17:00:00"
+ }
+ ],
+ "timex": "T17"
+ }
+ ]
+ }
+ ],
+ "b": [
+ {
+ "number": 72,
+ "units": "Degree"
+ }
+ ],
+ "begin": [
+ {
+ "number": 6,
+ "units": "Year"
+ }
+ ],
+ "buy": [
+ "kb922"
+ ],
+ "Buyer": [
+ [
+ "Delta"
+ ]
+ ],
+ "datetimeV2": [
+ {
+ "type": "duration",
+ "values": [
+ {
+ "resolution": [
+ {
+ "value": "189216000"
+ }
+ ],
+ "timex": "P6Y"
+ }
+ ]
+ },
+ {
+ "type": "duration",
+ "values": [
+ {
+ "resolution": [
+ {
+ "value": "252288000"
+ }
+ ],
+ "timex": "P8Y"
+ }
+ ]
+ }
+ ],
+ "destination": [
+ "redmond"
+ ],
+ "dimension": [
+ {
+ "number": 3,
+ "units": "Picometer"
+ },
+ {
+ "number": 5,
+ "units": "Picometer"
+ }
+ ],
+ "end": [
+ {
+ "number": 8,
+ "units": "Year"
+ }
+ ],
+ "geographyV2": [
+ {
+ "type": "state",
+ "value": "hawaii"
+ },
+ {
+ "type": "city",
+ "value": "redmond"
+ }
+ ],
+ "leave": [
+ {
+ "type": "time",
+ "values": [
+ {
+ "resolution": [
+ {
+ "value": "15:00:00"
+ }
+ ],
+ "timex": "T15"
+ }
+ ]
+ }
+ ],
+ "length": [
+ {
+ "number": 3,
+ "units": "Inch"
+ }
+ ],
+ "likee": [
+ "mary"
+ ],
+ "liker": [
+ "john"
+ ],
+ "max": [
+ {
+ "number": 500,
+ "units": "Dollar"
+ }
+ ],
+ "maximum": [
+ 10
+ ],
+ "min": [
+ {
+ "number": 400,
+ "units": "Dollar"
+ }
+ ],
+ "minimum": [
+ 5
+ ],
+ "newPhone": [
+ "206-666-4123"
+ ],
+ "number": [
+ 3,
+ 2,
+ 5,
+ 10,
+ 6,
+ 8,
+ 425,
+ 777,
+ 1212,
+ 206,
+ 666,
+ 4123,
+ 68,
+ 72,
+ 400,
+ 500
+ ],
+ "old": [
+ "425-777-1212"
+ ],
+ "oldURL": [
+ "http://foo.com"
+ ],
+ "personName": [
+ "john",
+ "mary"
+ ],
+ "receiver": [
+ "chrimc@hotmail.com"
+ ],
+ "sell": [
+ "kb457"
+ ],
+ "Seller": [
+ [
+ "Virgin"
+ ]
+ ],
+ "sender": [
+ "emad@gmail.com"
+ ],
+ "source": [
+ "hawaii"
+ ],
+ "url": [
+ "http://blah.com"
+ ],
+ "width": [
+ {
+ "number": 2,
+ "units": "Inch"
+ }
+ ]
+ },
+ "intents": {
+ "Cancel": {
+ "score": 4.48137826E-07
+ },
+ "Delivery": {
+ "score": 7.920229E-05
+ },
+ "EntityTests": {
+ "score": 0.00420103827
+ },
+ "Greeting": {
+ "score": 4.6571725E-07
+ },
+ "Help": {
+ "score": 7.5179554E-07
+ },
+ "None": {
+ "score": 0.0009303715
+ },
+ "Roles": {
+ "score": 1.0
+ },
+ "search": {
+ "score": 0.00245359377
+ },
+ "SpecifyName": {
+ "score": 5.62756977E-05
+ },
+ "Travel": {
+ "score": 0.002153493
+ },
+ "Weather.GetForecast": {
+ "score": 0.0100878729
+ }
+ },
+ "sentiment": {
+ "label": "neutral",
+ "score": 0.5
+ },
+ "topIntent": "Roles"
+ },
+ "query": "3 inches long by 2 inches wide and 5% to 10% and are you between 6 years old and 8 years old and can i trade kb457 for kb922 and change 425-777-1212 to 206-666-4123 and did delta buy virgin and did the rain from hawaii get to redmond and http://foo.com changed to http://blah.com and i like between 68 degrees and 72 degrees and john likes mary and leave 3pm and arrive 5pm and pay between $400 and $500 and send chrimc@hotmail.com from emad@gmail.com"
+ }
+ }
+}
diff --git a/doc/README.md b/libraries/bot-ai-qna/README.md
similarity index 100%
rename from doc/README.md
rename to libraries/bot-ai-qna/README.md
diff --git a/libraries/bot-ai-qna/pom.xml b/libraries/bot-ai-qna/pom.xml
new file mode 100644
index 000000000..fb2612a14
--- /dev/null
+++ b/libraries/bot-ai-qna/pom.xml
@@ -0,0 +1,102 @@
+
+
+ 4.0.0
+
+
+ com.microsoft.bot
+ bot-java
+ 4.15.0-SNAPSHOT
+ ../../pom.xml
+
+
+ bot-ai-qna
+ jar
+
+ ${project.groupId}:${project.artifactId}
+ Bot Framework QnA
+ https://dev.botframework.com/
+
+
+
+ MIT License
+ http://www.opensource.org/licenses/mit-license.php
+
+
+
+
+
+ Bot Framework Development
+
+ Microsoft
+ https://dev.botframework.com/
+
+
+
+
+ scm:git:https://github.com/Microsoft/botbuilder-java
+ scm:git:https://github.com/Microsoft/botbuilder-java
+ https://github.com/Microsoft/botbuilder-java
+
+
+
+ UTF-8
+ false
+
+
+
+
+ junit
+ junit
+
+
+ org.mockito
+ mockito-core
+
+
+
+ org.slf4j
+ slf4j-api
+
+
+
+ com.microsoft.bot
+ bot-integration-spring
+ compile
+
+
+ com.microsoft.bot
+ bot-dialogs
+
+
+ com.microsoft.bot
+ bot-builder
+ ${project.version}
+ test-jar
+ test
+
+
+
+ com.squareup.okhttp3
+ okhttp
+
+
+ com.squareup.okhttp3
+ mockwebserver
+ test
+
+
+
+
+
+ build
+
+ true
+
+
+
+
+
+
+
+
diff --git a/libraries/bot-ai-qna/src/main/java/com/microsoft/bot/ai/qna/JoinOperator.java b/libraries/bot-ai-qna/src/main/java/com/microsoft/bot/ai/qna/JoinOperator.java
new file mode 100644
index 000000000..cbba1cc6c
--- /dev/null
+++ b/libraries/bot-ai-qna/src/main/java/com/microsoft/bot/ai/qna/JoinOperator.java
@@ -0,0 +1,19 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package com.microsoft.bot.ai.qna;
+
+/**
+ * Join Operator for Strict Filters.
+ */
+public enum JoinOperator {
+ /**
+ * Default Join Operator, AND.
+ */
+ AND,
+
+ /**
+ * Join Operator, OR.
+ */
+ OR
+}
diff --git a/libraries/bot-ai-qna/src/main/java/com/microsoft/bot/ai/qna/QnADialogResponseOptions.java b/libraries/bot-ai-qna/src/main/java/com/microsoft/bot/ai/qna/QnADialogResponseOptions.java
new file mode 100644
index 000000000..be9bcf3ff
--- /dev/null
+++ b/libraries/bot-ai-qna/src/main/java/com/microsoft/bot/ai/qna/QnADialogResponseOptions.java
@@ -0,0 +1,88 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package com.microsoft.bot.ai.qna;
+
+import com.microsoft.bot.schema.Activity;
+
+/**
+ * QnA dialog response options class.
+ */
+public class QnADialogResponseOptions {
+ private String activeLearningCardTitle;
+ private String cardNoMatchText;
+ private Activity noAnswer;
+ private Activity cardNoMatchResponse;
+
+ /**
+ * Gets the active learning card title.
+ *
+ * @return The active learning card title
+ */
+ public String getActiveLearningCardTitle() {
+ return activeLearningCardTitle;
+ }
+
+ /**
+ * Sets the active learning card title.
+ *
+ * @param withActiveLearningCardTitle The active learning card title.
+ */
+ public void setActiveLearningCardTitle(String withActiveLearningCardTitle) {
+ this.activeLearningCardTitle = withActiveLearningCardTitle;
+ }
+
+ /**
+ * Gets the card no match text.
+ *
+ * @return The card no match text.
+ */
+ public String getCardNoMatchText() {
+ return cardNoMatchText;
+ }
+
+ /**
+ * Sets the card no match text.
+ *
+ * @param withCardNoMatchText The card no match text.
+ */
+ public void setCardNoMatchText(String withCardNoMatchText) {
+ this.cardNoMatchText = withCardNoMatchText;
+ }
+
+ /**
+ * Gets the no answer activity.
+ *
+ * @return The no answer activity.
+ */
+ public Activity getNoAnswer() {
+ return noAnswer;
+ }
+
+ /**
+ * Sets the no answer activity.
+ *
+ * @param withNoAnswer The no answer activity.
+ */
+ public void setNoAnswer(Activity withNoAnswer) {
+ this.noAnswer = withNoAnswer;
+ }
+
+ /**
+ * Gets the card no match response.
+ *
+ * @return The card no match response.
+ */
+ public Activity getCardNoMatchResponse() {
+ return cardNoMatchResponse;
+ }
+
+ /**
+ * Sets the card no match response.
+ *
+ * @param withCardNoMatchResponse The card no match response.
+ */
+ public void setCardNoMatchResponse(Activity withCardNoMatchResponse) {
+ this.cardNoMatchResponse = withCardNoMatchResponse;
+ }
+}
diff --git a/libraries/bot-ai-qna/src/main/java/com/microsoft/bot/ai/qna/QnAMaker.java b/libraries/bot-ai-qna/src/main/java/com/microsoft/bot/ai/qna/QnAMaker.java
new file mode 100644
index 000000000..91a233d4e
--- /dev/null
+++ b/libraries/bot-ai-qna/src/main/java/com/microsoft/bot/ai/qna/QnAMaker.java
@@ -0,0 +1,384 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+package com.microsoft.bot.ai.qna;
+
+import com.google.common.collect.LinkedListMultimap;
+import com.google.common.collect.Multimap;
+import com.microsoft.bot.ai.qna.models.FeedbackRecords;
+import com.microsoft.bot.ai.qna.models.QueryResult;
+import com.microsoft.bot.ai.qna.models.QueryResults;
+import com.microsoft.bot.ai.qna.utils.ActiveLearningUtils;
+import com.microsoft.bot.ai.qna.utils.GenerateAnswerUtils;
+import com.microsoft.bot.ai.qna.utils.QnATelemetryConstants;
+import com.microsoft.bot.ai.qna.utils.TrainUtils;
+
+import com.microsoft.bot.builder.BotTelemetryClient;
+import com.microsoft.bot.builder.NullBotTelemetryClient;
+import com.microsoft.bot.builder.TurnContext;
+import com.microsoft.bot.connector.Async;
+import com.microsoft.bot.restclient.serializer.JacksonAdapter;
+import com.microsoft.bot.schema.Activity;
+import com.microsoft.bot.schema.ActivityTypes;
+import com.microsoft.bot.schema.Pair;
+
+import javax.annotation.Nullable;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.concurrent.CompletableFuture;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Provides access to a QnA Maker knowledge base.
+ */
+public class QnAMaker implements QnAMakerClient, TelemetryQnAMaker {
+
+ private QnAMakerEndpoint endpoint;
+
+ private GenerateAnswerUtils generateAnswerHelper;
+ private TrainUtils activeLearningTrainHelper;
+ private Boolean logPersonalInformation;
+ @JsonIgnore
+ private BotTelemetryClient telemetryClient;
+
+ /**
+ * The name of the QnAMaker class.
+ */
+ public static final String QNA_MAKER_NAME = "QnAMaker";
+ /**
+ * The type used when logging QnA Maker trace.
+ */
+ public static final String QNA_MAKER_TRACE_TYPE = "https://www.qnamaker.ai/schemas/trace";
+ /**
+ * The label used when logging QnA Maker trace.
+ */
+ public static final String QNA_MAKER_TRACE_LABEL = "QnAMaker Trace";
+
+ /**
+ * Initializes a new instance of the QnAMaker class.
+ *
+ * @param withEndpoint The endpoint of the knowledge base to
+ * query.
+ * @param options The options for the QnA Maker knowledge
+ * base.
+ * @param withTelemetryClient The IBotTelemetryClient used for logging
+ * telemetry events.
+ * @param withLogPersonalInformation Set to true to include personally
+ * identifiable information in telemetry
+ * events.
+ */
+ public QnAMaker(
+ QnAMakerEndpoint withEndpoint,
+ QnAMakerOptions options,
+ BotTelemetryClient withTelemetryClient,
+ Boolean withLogPersonalInformation
+ ) {
+ if (withLogPersonalInformation == null) {
+ withLogPersonalInformation = false;
+ }
+
+ if (withEndpoint == null) {
+ throw new IllegalArgumentException("endpoint");
+ }
+ this.endpoint = withEndpoint;
+
+ if (StringUtils.isBlank(this.endpoint.getKnowledgeBaseId())) {
+ throw new IllegalArgumentException("knowledgeBaseId");
+ }
+
+ if (StringUtils.isBlank(this.endpoint.getHost())) {
+ throw new IllegalArgumentException("host");
+ }
+
+ if (StringUtils.isBlank(this.endpoint.getEndpointKey())) {
+ throw new IllegalArgumentException("endpointKey");
+ }
+
+ if (this.endpoint.getHost().endsWith("v2.0") || this.endpoint.getHost().endsWith("v3.0")) {
+ throw new UnsupportedOperationException(
+ "v2.0 and v3.0 of QnA Maker service" + " is no longer supported in the QnA Maker."
+ );
+ }
+
+ this.telemetryClient = withTelemetryClient != null ? withTelemetryClient : new NullBotTelemetryClient();
+ this.logPersonalInformation = withLogPersonalInformation;
+
+ this.generateAnswerHelper = new GenerateAnswerUtils(this.endpoint, options);
+ this.activeLearningTrainHelper = new TrainUtils(this.endpoint);
+ }
+
+ /**
+ * Initializes a new instance of the {@link QnAMaker} class.
+ *
+ * @param withEndpoint The endpoint of the knowledge base to query.
+ * @param options The options for the QnA Maker knowledge base.
+ */
+ public QnAMaker(QnAMakerEndpoint withEndpoint, @Nullable QnAMakerOptions options) {
+ this(withEndpoint, options, null, null);
+ }
+
+ /**
+ * Gets a value indicating whether determines whether to log personal
+ * information that came from the user.
+ *
+ * @return If true, will log personal information into the
+ * IBotTelemetryClient.TrackEvent method; otherwise the properties will
+ * be filtered.
+ */
+ public Boolean getLogPersonalInformation() {
+ return this.logPersonalInformation;
+ }
+
+ /**
+ * Gets the currently configured {@link BotTelemetryClient}.
+ *
+ * @return {@link BotTelemetryClient} being used to log events.
+ */
+ public BotTelemetryClient getTelemetryClient() {
+ return this.telemetryClient;
+ }
+
+ /**
+ * Generates an answer from the knowledge base.
+ *
+ * @param turnContext The Turn Context that contains the user question to be
+ * queried against your knowledge base.
+ * @param options The options for the QnA Maker knowledge base. If null,
+ * constructor option is used for this instance.
+ * @return A list of answers for the user query, sorted in decreasing order of
+ * ranking score.
+ */
+ public CompletableFuture getAnswers(TurnContext turnContext, @Nullable QnAMakerOptions options) {
+ return this.getAnswers(turnContext, options, null, null);
+ }
+
+ /**
+ * Generates an answer from the knowledge base.
+ *
+ * @param turnContext The Turn Context that contains the user question
+ * to be queried against your knowledge base.
+ * @param options The options for the QnA Maker knowledge base. If
+ * null, constructor option is used for this
+ * instance.
+ * @param telemetryProperties Additional properties to be logged to telemetry
+ * with the QnaMessage event.
+ * @param telemetryMetrics Additional metrics to be logged to telemetry with
+ * the QnaMessage event.
+ * @return A list of answers for the user query, sorted in decreasing order of
+ * ranking score.
+ */
+ public CompletableFuture getAnswers(
+ TurnContext turnContext,
+ QnAMakerOptions options,
+ Map telemetryProperties,
+ @Nullable Map telemetryMetrics
+ ) {
+ return this.getAnswersRaw(turnContext, options, telemetryProperties, telemetryMetrics)
+ .thenApply(result -> result.getAnswers());
+ }
+
+ /**
+ * Generates an answer from the knowledge base.
+ *
+ * @param turnContext The Turn Context that contains the user question
+ * to be queried against your knowledge base.
+ * @param options The options for the QnA Maker knowledge base. If
+ * null, constructor option is used for this
+ * instance.
+ * @param telemetryProperties Additional properties to be logged to telemetry
+ * with the QnaMessage event.
+ * @param telemetryMetrics Additional metrics to be logged to telemetry with
+ * the QnaMessage event.
+ * @return A list of answers for the user query, sorted in decreasing order of
+ * ranking score.
+ */
+ public CompletableFuture getAnswersRaw(
+ TurnContext turnContext,
+ QnAMakerOptions options,
+ @Nullable Map telemetryProperties,
+ @Nullable Map telemetryMetrics
+ ) {
+ if (turnContext == null) {
+ return Async.completeExceptionally(new IllegalArgumentException("turnContext"));
+ }
+ if (turnContext.getActivity() == null) {
+ return Async.completeExceptionally(
+ new IllegalArgumentException(
+ String.format("The %1$s property for %2$s can't be null.", "Activity", "turnContext")
+ )
+ );
+ }
+ Activity messageActivity = turnContext.getActivity();
+ if (messageActivity == null || !messageActivity.isType(ActivityTypes.MESSAGE)) {
+ return Async.completeExceptionally(new IllegalArgumentException("Activity type is not a message"));
+ }
+
+ if (StringUtils.isBlank(turnContext.getActivity().getText())) {
+ return Async.completeExceptionally(new IllegalArgumentException("Null or empty text"));
+ }
+
+ return this.generateAnswerHelper.getAnswersRaw(turnContext, messageActivity, options).thenCompose(result -> {
+ try {
+ this.onQnaResults(result.getAnswers(), turnContext, telemetryProperties, telemetryMetrics);
+ } catch (IOException e) {
+ LoggerFactory.getLogger(QnAMaker.class).error("getAnswersRaw");
+ }
+ return CompletableFuture.completedFuture(result);
+ });
+ }
+
+ /**
+ * Filters the ambiguous question for active learning.
+ *
+ * @param queryResult User query output.
+ * @return Filtered array of ambiguous question.
+ */
+ public QueryResult[] getLowScoreVariation(QueryResult[] queryResult) {
+ List queryResults = ActiveLearningUtils.getLowScoreVariation(Arrays.asList(queryResult));
+ return queryResults.toArray(new QueryResult[queryResults.size()]);
+ }
+
+ /**
+ * Send feedback to the knowledge base.
+ *
+ * @param feedbackRecords Feedback records.
+ * @return Representing the asynchronous operation.
+ * @throws IOException Throws an IOException if there is any.
+ */
+ public CompletableFuture callTrain(FeedbackRecords feedbackRecords) throws IOException {
+ return this.activeLearningTrainHelper.callTrain(feedbackRecords);
+ }
+
+ /**
+ * Executed when a result is returned from QnA Maker.
+ *
+ * @param queryResults An array of {@link QueryResult}
+ * @param turnContext The {@link TurnContext}
+ * @param telemetryProperties Additional properties to be logged to telemetry
+ * with the LuisResult event.
+ * @param telemetryMetrics Additional metrics to be logged to telemetry with
+ * the LuisResult event.
+ * @return A Task representing the work to be executed.
+ * @throws IOException Throws an IOException if there is any.
+ */
+ protected CompletableFuture onQnaResults(
+ QueryResult[] queryResults,
+ TurnContext turnContext,
+ @Nullable Map telemetryProperties,
+ @Nullable Map telemetryMetrics
+ ) throws IOException {
+ return fillQnAEvent(queryResults, turnContext, telemetryProperties, telemetryMetrics).thenAccept(
+ eventData -> {
+ // Track the event
+ this.telemetryClient
+ .trackEvent(QnATelemetryConstants.QNA_MSG_EVENT, eventData.getLeft(), eventData.getRight());
+ }
+ );
+ }
+
+ /**
+ * Fills the event properties and metrics for the QnaMessage event for
+ * telemetry. These properties are logged when the QnA GetAnswers method is
+ * called.
+ *
+ * @param queryResults QnA service results.
+ * @param turnContext Context object containing information for a single
+ * turn of conversation with a user.
+ * @param telemetryProperties Properties to add/override for the event.
+ * @param telemetryMetrics Metrics to add/override for the event.
+ * @return A tuple of Properties and Metrics that will be sent to the
+ * IBotTelemetryClient. TrackEvent method for the QnAMessage event. The
+ * properties and metrics returned the standard properties logged with
+ * any properties passed from the GetAnswersAsync method.
+ * @throws IOException Throws an IOException if there is any.
+ */
+ protected CompletableFuture, Map>> fillQnAEvent(
+ QueryResult[] queryResults,
+ TurnContext turnContext,
+ @Nullable Map telemetryProperties,
+ @Nullable Map telemetryMetrics
+ ) throws IOException {
+ Map properties = new HashMap