From 7fe29a8507cf6acbbdf8d656e47d92d3d970c668 Mon Sep 17 00:00:00 2001 From: ramiyer1998 Date: Tue, 11 Dec 2018 20:35:50 -0500 Subject: [PATCH 1/5] added tour files --- www/bars.mustache.html | 25 +- www/bootstrap-tour/.editorconfig | 21 + www/bootstrap-tour/.gitignore | 10 + www/bootstrap-tour/.travis.yml | 14 + www/bootstrap-tour/CNAME | 1 + www/bootstrap-tour/LICENSE | 19 + www/bootstrap-tour/README.md | 74 + www/bootstrap-tour/_config.yml | 5 + www/bootstrap-tour/bower.json | 17 + www/bootstrap-tour/coffeelint.json | 127 + www/bootstrap-tour/composer.json | 13 + www/bootstrap-tour/gulpfile.coffee | 214 + www/bootstrap-tour/gulpfile.js | 2 + www/bootstrap-tour/karma.conf.js | 12 + www/bootstrap-tour/package.js | 3 + www/bootstrap-tour/package.json | 79 + www/bootstrap-tour/smart.json | 9 + .../src/coffee/bootstrap-tour.coffee | 835 ++++ .../src/coffee/bootstrap-tour.docs.coffee | 95 + .../src/coffee/bootstrap-tour.spec.coffee | 1274 ++++++ .../src/less/bootstrap-tour-standalone.less | 16 + .../src/less/bootstrap-tour.less | 39 + www/bootstrap-tour/yarn.lock | 3969 +++++++++++++++++ www/cluster.mustache.html | 17 +- www/nodes.js | 291 +- www/splash.mustache.html | 191 +- www/topicprint.js | 1648 +++---- 27 files changed, 8087 insertions(+), 933 deletions(-) create mode 100755 www/bootstrap-tour/.editorconfig create mode 100755 www/bootstrap-tour/.gitignore create mode 100755 www/bootstrap-tour/.travis.yml create mode 100755 www/bootstrap-tour/CNAME create mode 100755 www/bootstrap-tour/LICENSE create mode 100755 www/bootstrap-tour/README.md create mode 100755 www/bootstrap-tour/_config.yml create mode 100755 www/bootstrap-tour/bower.json create mode 100755 www/bootstrap-tour/coffeelint.json create mode 100755 www/bootstrap-tour/composer.json create mode 100755 www/bootstrap-tour/gulpfile.coffee create mode 100755 www/bootstrap-tour/gulpfile.js create mode 100755 www/bootstrap-tour/karma.conf.js create mode 100755 www/bootstrap-tour/package.js create mode 100755 www/bootstrap-tour/package.json create mode 100755 www/bootstrap-tour/smart.json create mode 100755 www/bootstrap-tour/src/coffee/bootstrap-tour.coffee create mode 100755 www/bootstrap-tour/src/coffee/bootstrap-tour.docs.coffee create mode 100755 www/bootstrap-tour/src/coffee/bootstrap-tour.spec.coffee create mode 100755 www/bootstrap-tour/src/less/bootstrap-tour-standalone.less create mode 100755 www/bootstrap-tour/src/less/bootstrap-tour.less create mode 100755 www/bootstrap-tour/yarn.lock mode change 100644 => 100755 www/cluster.mustache.html mode change 100644 => 100755 www/nodes.js mode change 100644 => 100755 www/splash.mustache.html mode change 100644 => 100755 www/topicprint.js diff --git a/www/bars.mustache.html b/www/bars.mustache.html index ded4fd8b..4133680d 100755 --- a/www/bars.mustache.html +++ b/www/bars.mustache.html @@ -1,17 +1,23 @@ +
-

InPhO Topic Explorer

+

InPhO Topic Explorer

{{#corpus_link}}{{corpus_name}}{{/corpus_link}} {{^corpus_link}}{{corpus_name}}{{/corpus_link}}
About this corpus
Click ? button at bottom left for help with the topic explorer interface.

+
+

+
+
-
+ +
@@ -20,20 +26,20 @@

-
+
- +
-
+
-
- +
+
@@ -122,4 +128,7 @@

Fingerprint icon Topic Fingerp

+ + + diff --git a/www/bootstrap-tour/.editorconfig b/www/bootstrap-tour/.editorconfig new file mode 100755 index 00000000..fdbdf0db --- /dev/null +++ b/www/bootstrap-tour/.editorconfig @@ -0,0 +1,21 @@ +EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# editorconfig.org + +root = true + + +[*] + +# Change these settings to your own preference +indent_style = space +indent_size = 2 + +# We recommend you to keep these unchanged +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false diff --git a/www/bootstrap-tour/.gitignore b/www/bootstrap-tour/.gitignore new file mode 100755 index 00000000..cba37588 --- /dev/null +++ b/www/bootstrap-tour/.gitignore @@ -0,0 +1,10 @@ +node_modules +bower_components +bootstrap-tour.sublime-project +bootstrap-tour.sublime-workspace +npm-debug.log +test +docs +_SpecRunner.html +*.DS_Store +smart.lock diff --git a/www/bootstrap-tour/.travis.yml b/www/bootstrap-tour/.travis.yml new file mode 100755 index 00000000..0ef90a6b --- /dev/null +++ b/www/bootstrap-tour/.travis.yml @@ -0,0 +1,14 @@ +dist: trusty +sudo: required +language: node_js +node_js: + - 8 +addons: + chrome: stable +before_install: + - "export CHROME_BIN=chromium-browser" + - "export DISPLAY=:99.0" + - "sh -e /etc/init.d/xvfb start" +before_script: + - "yarn global add bower gulp-cli" + - "bower install" diff --git a/www/bootstrap-tour/CNAME b/www/bootstrap-tour/CNAME new file mode 100755 index 00000000..b876b5ae --- /dev/null +++ b/www/bootstrap-tour/CNAME @@ -0,0 +1 @@ +bootstraptour.com diff --git a/www/bootstrap-tour/LICENSE b/www/bootstrap-tour/LICENSE new file mode 100755 index 00000000..8201fc17 --- /dev/null +++ b/www/bootstrap-tour/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2013-2015 The Bootstrap Tour community + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION 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/www/bootstrap-tour/README.md b/www/bootstrap-tour/README.md new file mode 100755 index 00000000..30d1746e --- /dev/null +++ b/www/bootstrap-tour/README.md @@ -0,0 +1,74 @@ +# Bootstrap Tour +[![Build Status](http://img.shields.io/travis/sorich87/bootstrap-tour.svg?style=flat)](https://travis-ci.org/sorich87/bootstrap-tour) +[![Dependency Status](http://img.shields.io/david/sorich87/bootstrap-tour.svg?style=flat)](https://david-dm.org/sorich87/bootstrap-tour) +[![devDependency Status](http://img.shields.io/david/dev/sorich87/bootstrap-tour/dev-status.svg?style=flat)](https://david-dm.org/sorich87/bootstrap-tour#info=devDependencies) +[![NPM Version](http://img.shields.io/npm/v/bootstrap-tour.svg?style=flat)](https://www.npmjs.org/) + +Quick and easy way to build your product tours with Bootstrap Popovers. + +*Compatible with Bootstrap >= 2.3.0* + +## Demo and Documentation +[http://bootstraptour.com](http://bootstraptour.com) + +## Contributing +In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [Gulp](http://gulpjs.com/). + +Feel free to contribute with pull requests, bug reports or enhancement suggestions. + +We use [Gulp](http://gulpjs.com/) and [Jasmine](http://jasmine.github.io/). Both make your life easier ;) + +### Develop + +Files to be developed are located under `./src/`. +Compiled sources are then automatically put under `./build/`, `./test/` and `./docs/`. + +#### Requirements + +To begin, you need a few standard dependencies installed. These commands will install ruby, gem, node, yarn, and gulp's command line runner: + +##### Debian/Ubuntu Linux + +```bash +$ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - +$ echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list +$ sudo apt-get update && sudo apt-get install ruby-full yarn +``` + +##### Mac OS X + +```bash +$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" +$ brew install ruby yarn +``` + +##### Development requirements + +```bash +$ yarn global add gulp-cli +$ yarn +$ gem install jekyll +``` + +For Mac OS X Mavericks (10.9) users: You will need to [jump through all these hoops](http://dean.io/setting-up-a-ruby-on-rails-development-environment-on-mavericks/) before you can install Jekyll. + +#### Gulp usage + +Run gulp and start to develop with ease: + +```bash +$ gulp +$ gulp dist +$ gulp test +$ gulp docs +$ gulp clean +$ gulp server +$ gulp bump --type minor (major.minor.patch) +``` + +Check `gulpfile.coffee` to know more. + +## License + +Code licensed under the [MIT license](https://opensource.org/licenses/MIT). +Documentation licensed under [CC BY 3.0](http://creativecommons.org/licenses/by/3.0/). diff --git a/www/bootstrap-tour/_config.yml b/www/bootstrap-tour/_config.yml new file mode 100755 index 00000000..80dfdc77 --- /dev/null +++ b/www/bootstrap-tour/_config.yml @@ -0,0 +1,5 @@ +markdown: rdiscount +permalink: pretty +source: ./src/docs +destination: ./docs +encoding: UTF-8 diff --git a/www/bootstrap-tour/bower.json b/www/bootstrap-tour/bower.json new file mode 100755 index 00000000..31fffdc4 --- /dev/null +++ b/www/bootstrap-tour/bower.json @@ -0,0 +1,17 @@ +{ + "name": "bootstrap-tour", + "main": [ + "./build/js/bootstrap-tour-standalone.js", + "./build/css/bootstrap-tour-standalone.css" + ], + "dependencies": { + "bootstrap": ">=2.3.2", + "jquery": ">=1.9.0" + }, + "devDependencies": { + "html5shiv": "~3.7.2", + "jquery": "~2.1.1", + "bootstrap": "~3.3.7", + "blueimp-md5": "~2.3.0" + } +} diff --git a/www/bootstrap-tour/coffeelint.json b/www/bootstrap-tour/coffeelint.json new file mode 100755 index 00000000..4187a7d7 --- /dev/null +++ b/www/bootstrap-tour/coffeelint.json @@ -0,0 +1,127 @@ +{ + "coffeescript_error": { + "level": "error" + }, + "arrow_spacing": { + "name": "arrow_spacing", + "level": "ignore" + }, + "no_tabs": { + "name": "no_tabs", + "level": "error" + }, + "no_trailing_whitespace": { + "name": "no_trailing_whitespace", + "level": "error", + "allowed_in_comments": false, + "allowed_in_empty_lines": false + }, + "max_line_length": { + "name": "max_line_length", + "value": 120, + "level": "error", + "limitComments": true + }, + "line_endings": { + "name": "line_endings", + "level": "warn", + "value": "unix" + }, + "no_trailing_semicolons": { + "name": "no_trailing_semicolons", + "level": "error" + }, + "indentation": { + "name": "indentation", + "value": 2, + "level": "error" + }, + "camel_case_classes": { + "name": "camel_case_classes", + "level": "error" + }, + "colon_assignment_spacing": { + "name": "colon_assignment_spacing", + "level": "ignore", + "spacing": { + "left": 0, + "right": 0 + } + }, + "no_implicit_braces": { + "name": "no_implicit_braces", + "level": "ignore", + "strict": true + }, + "no_plusplus": { + "name": "no_plusplus", + "level": "ignore" + }, + "no_throwing_strings": { + "name": "no_throwing_strings", + "level": "error" + }, + "no_backticks": { + "name": "no_backticks", + "level": "error" + }, + "no_implicit_parens": { + "name": "no_implicit_parens", + "strict": true, + "level": "ignore" + }, + "no_empty_param_list": { + "name": "no_empty_param_list", + "level": "error" + }, + "no_stand_alone_at": { + "name": "no_stand_alone_at", + "level": "ignore" + }, + "space_operators": { + "name": "space_operators", + "level": "ignore" + }, + "duplicate_key": { + "name": "duplicate_key", + "level": "error" + }, + "empty_constructor_needs_parens": { + "name": "empty_constructor_needs_parens", + "level": "ignore" + }, + "cyclomatic_complexity": { + "name": "cyclomatic_complexity", + "value": 10, + "level": "ignore" + }, + "newlines_after_classes": { + "name": "newlines_after_classes", + "value": 3, + "level": "error" + }, + "no_unnecessary_fat_arrows": { + "name": "no_unnecessary_fat_arrows", + "level": "error" + }, + "missing_fat_arrows": { + "name": "missing_fat_arrows", + "level": "ignore" + }, + "non_empty_constructor_needs_parens": { + "name": "non_empty_constructor_needs_parens", + "level": "ignore" + }, + "no_unnecessary_double_quotes": { + "name": "no_unnecessary_double_quotes", + "level": "error" + }, + "no_debugger": { + "name": "no_debugger", + "level": "warn" + }, + "no_interpolation_in_single_quotes": { + "name": "no_interpolation_in_single_quotes", + "level": "ignore" + } +} diff --git a/www/bootstrap-tour/composer.json b/www/bootstrap-tour/composer.json new file mode 100755 index 00000000..7ae670f7 --- /dev/null +++ b/www/bootstrap-tour/composer.json @@ -0,0 +1,13 @@ +{ + "name": "sorich87/bootstrap-tour", + "description": "Quick and easy way to build your product tours with Bootstrap Popovers.", + "type":"component", + "url":"https://github.com/sorich87/bootstrap-tour.git", + "homepage": "http://bootstraptour.com/", + "description": "Show people how to use your web site", + "keywords": [ + "bootstrap", + "tour" + ], + "license": "MIT" +} diff --git a/www/bootstrap-tour/gulpfile.coffee b/www/bootstrap-tour/gulpfile.coffee new file mode 100755 index 00000000..fa85a0ef --- /dev/null +++ b/www/bootstrap-tour/gulpfile.coffee @@ -0,0 +1,214 @@ +gulp = require 'gulp' +$ = require('gulp-load-plugins') lazy: false +extend = require('util')._extend +streamqueue = require 'streamqueue' +spawn = require('child_process').spawn +KarmaServer = require('karma').Server +pkg = require './package.json' +name = pkg.name + +paths = + src: './src' + dist: './build' + test: './test' + docs: './docs' +server = + host: 'localhost' + port: 3000 +banner = ''' + /* ======================================================================== + * <%= pkg.name %> - v<%= pkg.version %> + * <%= pkg.homepage %> + * ======================================================================== + * Copyright 2012-2015 <%= pkg.author.name %> + * + * ======================================================================== + * Licensed under the MIT License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/MIT + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================================== + */ + + + ''' + +# coffee +gulp.task 'coffee', -> + gulp + .src "#{paths.src}/coffee/#{name}.coffee" + .pipe $.changed "#{paths.dist}/js" + .pipe $.coffeelint './coffeelint.json' + .pipe $.coffeelint.reporter() + .on 'error', $.util.log + .pipe $.coffee bare: true + .on 'error', $.util.log + .pipe $.header banner, pkg: pkg + .pipe gulp.dest "#{paths.dist}/js" + .pipe gulp.dest "#{paths.src}/docs/assets/js" + .pipe gulp.dest paths.test + .pipe $.uglify() + .pipe $.header banner, pkg: pkg + .pipe $.rename suffix: '.min' + .pipe gulp.dest "#{paths.dist}/js" + +gulp.task 'coffee-standalone', -> + streamqueue objectMode: true, + gulp + .src [ + "./bower_components/bootstrap/js/transition.js" + "./bower_components/bootstrap/js/tooltip.js" + "./bower_components/bootstrap/js/popover.js" + ] + , + gulp + .src "#{paths.src}/coffee/#{name}.coffee" + .pipe $.changed "#{paths.dist}/js" + .pipe $.coffeelint './coffeelint.json' + .pipe $.coffeelint.reporter() + .on 'error', $.util.log + .pipe $.coffee bare: true + .on 'error', $.util.log + .pipe $.concat "#{name}-standalone.js" + .pipe $.header banner, pkg: pkg + .pipe gulp.dest "#{paths.dist}/js" + .pipe $.uglify() + .pipe $.header banner, pkg: pkg + .pipe $.rename suffix: '.min' + .pipe gulp.dest "#{paths.dist}/js" + +# less +gulp.task 'less', -> + gulp + .src [ + "#{paths.src}/less/#{name}.less" + ] + .pipe $.changed "#{paths.dist}/css" + .pipe $.less() + .on 'error', $.util.log + .pipe $.header banner, pkg: pkg + .pipe gulp.dest "#{paths.dist}/css" + .pipe gulp.dest "#{paths.src}/docs/assets/css" + .pipe $.less compress: true, cleancss: true + .pipe $.header banner, pkg: pkg + .pipe $.rename suffix: '.min' + .pipe gulp.dest "#{paths.dist}/css" + +gulp.task 'less-standalone', -> + gulp + .src "#{paths.src}/less/#{name}-standalone.less" + .pipe $.changed "#{paths.dist}/css" + .pipe $.less() + .on 'error', $.util.log + .pipe $.header banner, pkg: pkg + .pipe gulp.dest "#{paths.dist}/css" + .pipe $.less compress: true, cleancss: true + .pipe $.header banner, pkg: pkg + .pipe $.rename suffix: '.min' + .pipe gulp.dest "#{paths.dist}/css" + +# test +gulp.task 'test-coffee', ['coffee'], -> + gulp + .src "#{paths.src}/coffee/#{name}.spec.coffee" + .pipe $.changed paths.test + .pipe $.coffeelint './coffeelint.json' + .pipe $.coffeelint.reporter() + .on 'error', $.util.log + .pipe $.coffee() + .on 'error', $.util.log + .pipe gulp.dest paths.test + +gulp.task 'test-go', ['test-coffee'], (done) -> + new KarmaServer({ configFile: __dirname + '/karma.conf.js', singleRun: true}, done).start() + +# docs +gulp.task 'docs-build', ['coffee', 'less'], (done) -> + spawn `(process.platform === 'win32' ? 'jekyll.bat' : 'jekyll')`, ['build'] + .on 'close', done + +gulp.task 'docs-copy', ['docs-build'], -> + gulp + .src "./bower_components/**/*" + .pipe gulp.dest "#{paths.docs}/components" + +gulp.task 'docs-coffee', ['docs-build'], -> + gulp + .src "#{paths.src}/coffee/#{name}.docs.coffee" + .pipe $.changed "#{paths.docs}/assets/js" + .pipe $.coffeelint.reporter() + .on 'error', $.util.log + .pipe $.coffee() + .on 'error', $.util.log + .pipe gulp.dest "#{paths.docs}/assets/js" + +# clean +gulp.task 'clean-dist', -> + gulp + .src paths.dist + .pipe $.clean() + +gulp.task 'clean-test', -> + gulp + .src paths.test + .pipe $.clean() + +gulp.task 'clean-docs', -> + gulp + .src paths.docs + .pipe $.clean() + +# connect +gulp.task 'connect', ['docs'], -> + $.connect.server + root: [paths.docs] + host: server.host + port: server.port + livereload: true + +# open +gulp.task 'open', ['connect'], -> + gulp + .src "#{paths.docs}/index.html" + .pipe $.open uri: "http://#{server.host}:#{server.port}" + +gulp.task 'watch', ['connect'], -> + gulp.watch "#{paths.src}/coffee/#{name}.coffee", ['coffee', 'coffee-standalone'] + gulp.watch "#{paths.src}/less/#{name}.less", ["less", "less-standalone"] + gulp.watch "#{paths.src}/less/#{name}-standalone.less", ['less-standalone'] + gulp.watch "#{paths.src}/coffee/#{name}.spec.coffee", ['test'] + gulp.watch [ + "#{paths.src}/coffee/#{name}.docs.coffee" + "#{paths.src}/docs/**/*" + ], ['docs'] + gulp.watch [ + "#{paths.dist}/js/**/*.js" + "#{paths.dist}/css/**/*.css" + "#{paths.docs}/index.html" + ] + .on 'change', (event) -> + gulp.src event.path + .pipe $.connect.reload() + +# bump +gulp.task 'bump', ['test'], -> + bumpType = $.util.env.type || 'patch' + + gulp.src(['./package.json', './smart.json']) + .pipe $.bump(type: bumpType) + .pipe gulp.dest('./') + +# tasks +gulp.task 'clean', ['clean-dist', 'clean-test', 'clean-docs'] +gulp.task 'server', ['connect', 'open', 'watch'] +gulp.task 'dist', ['coffee', 'coffee-standalone', 'less', 'less-standalone'] +gulp.task 'test', ['coffee', 'test-coffee', 'test-go'] +gulp.task 'docs', ['coffee', 'less', 'docs-build', 'docs-copy', 'docs-coffee'] +gulp.task 'default', ['dist', 'docs', 'server'] diff --git a/www/bootstrap-tour/gulpfile.js b/www/bootstrap-tour/gulpfile.js new file mode 100755 index 00000000..c7f2b8b8 --- /dev/null +++ b/www/bootstrap-tour/gulpfile.js @@ -0,0 +1,2 @@ +require('coffee-script/register'); +require('./gulpfile.coffee'); diff --git a/www/bootstrap-tour/karma.conf.js b/www/bootstrap-tour/karma.conf.js new file mode 100755 index 00000000..782289b5 --- /dev/null +++ b/www/bootstrap-tour/karma.conf.js @@ -0,0 +1,12 @@ +module.exports = function(config) { + config.set({ + browsers: ['ChromeHeadless', 'Firefox'], + files: [ + 'bower_components/jquery/dist/jquery.js', + 'bower_components/bootstrap/dist/js/bootstrap.js', + 'test/bootstrap-tour.js', + 'test/bootstrap-tour.spec.js' + ], + frameworks: ['jasmine'] + }); +}; diff --git a/www/bootstrap-tour/package.js b/www/bootstrap-tour/package.js new file mode 100755 index 00000000..de35ef21 --- /dev/null +++ b/www/bootstrap-tour/package.js @@ -0,0 +1,3 @@ +Package.describe({ + summary: "Quick and easy way to build your product tours with Bootstrap Popovers." +}); diff --git a/www/bootstrap-tour/package.json b/www/bootstrap-tour/package.json new file mode 100755 index 00000000..167a1980 --- /dev/null +++ b/www/bootstrap-tour/package.json @@ -0,0 +1,79 @@ +{ + "name": "bootstrap-tour", + "description": "Quick and easy way to build your product tours with Bootstrap Popovers.", + "version": "0.12.0", + "keywords": [ + "tour", + "bootstrap", + "js", + "tour", + "intro" + ], + "homepage": "http://bootstraptour.com", + "author": { + "name": "Ulrich Sossou", + "email": "sorich87@gmail.com", + "url": "http://ulrichsossou.com" + }, + "contributors": [ + { + "name": "Emanuele Marchi", + "email": "emanuele@lostcrew.it", + "url": "http://lostcrew.it" + }, + { + "name": "Nicola Molinari", + "email": "emmenko@gmail.com" + } + ], + "repository": { + "type": "git", + "url": "https://github.com/sorich87/bootstrap-tour.git" + }, + "bugs": { + "url": "https://github.com/sorich87/bootstrap-tour/issues" + }, + "licenses": [ + { + "type": "MIT", + "url": "https://opensource.org/licenses/MIT" + } + ], + "dependencies": { + "bootstrap": "~3", + "jquery": ">=1.8" + }, + "devDependencies": { + "coffee-script": "~1.12.7", + "gulp": "~3.9.0", + "gulp-bump": "~2.7", + "gulp-changed": "~3.1.0", + "gulp-clean": "~0.3.1", + "gulp-coffee": "~2.3.4", + "gulp-coffeelint": "~0.6.0", + "gulp-concat": "~2.6.1", + "gulp-connect": "~5.0.0", + "gulp-header": "~1.8.9", + "gulp-jasmine": "~2.4.2", + "gulp-less": "~3.3.2", + "gulp-load-plugins": "~1.5.0", + "gulp-open": "~2.0.0", + "gulp-rename": "~1.2.0", + "gulp-uglify": "~3.0.0", + "gulp-util": "~3.0.0", + "karma": "~1.7.1", + "karma-chrome-launcher": "^2.2.0", + "karma-firefox-launcher": "^1.0.1", + "karma-jasmine": "~1.1.0", + "phantomjs": "^2.1.7", + "streamqueue": "1.1.1" + }, + "engines": { + "node": ">= 0.8.0" + }, + "main": "./build/js/bootstrap-tour.js", + "scripts": { + "build": "gulp dist", + "test": "gulp test" + } +} diff --git a/www/bootstrap-tour/smart.json b/www/bootstrap-tour/smart.json new file mode 100755 index 00000000..46342d4c --- /dev/null +++ b/www/bootstrap-tour/smart.json @@ -0,0 +1,9 @@ +{ + "name": "bootstrap-tour", + "description": "Quick and easy way to build your product tours with Bootstrap Popovers.", + "homepage": "http://bootstraptour.com", + "author": "Ulrich Sossou (http://ulrichsossou.com)", + "version": "0.12.0", + "git": "https://github.com/sorich87/bootstrap-tour.git", + "packages": {} +} diff --git a/www/bootstrap-tour/src/coffee/bootstrap-tour.coffee b/www/bootstrap-tour/src/coffee/bootstrap-tour.coffee new file mode 100755 index 00000000..8d3e952d --- /dev/null +++ b/www/bootstrap-tour/src/coffee/bootstrap-tour.coffee @@ -0,0 +1,835 @@ +((window, factory) -> + if typeof define is 'function' and define.amd + define ['jquery'], (jQuery) -> (window.Tour = factory(jQuery)) + else if typeof exports is 'object' + module.exports = factory(require('jquery')) + else + window.Tour = factory(window.jQuery) +)(window, ($) -> + document = window.document + + class Tour + constructor: (options) -> + try + storage = window.localStorage + catch + # localStorage may be unavailable due to security settings + storage = false + @_options = $.extend + name: 'tour' + steps: [] + container: 'body' + autoscroll: true + keyboard: true + storage: storage + debug: false + backdrop: false + backdropContainer: 'body' + backdropPadding: 0 + redirect: true + orphan: false + duration: false + delay: false + basePath: '' + template: '' + afterSetState: (key, value) -> + afterGetState: (key, value) -> + afterRemoveState: (key) -> + onStart: (tour) -> + onEnd: (tour) -> + onShow: (tour) -> + onShown: (tour) -> + onHide: (tour) -> + onHidden: (tour) -> + onNext: (tour) -> + onPrev: (tour) -> + onPause: (tour, duration) -> + onResume: (tour, duration) -> + onRedirectError: (tour) -> + , options + + @_force = false + @_inited = false + @_current = null + @backdrops = [] + @ + + # Add multiple steps + addSteps: (steps) -> + @addStep step for step in steps + @ + + # Add a new step + addStep: (step) -> + @_options.steps.push step + @ + + # Get a step by its indice + getStep: (i) -> + if @_options.steps[i]? + $.extend + id: "step-#{i}" + path: '' + host: '' + placement: 'right' + title: '' + content: '

' # no empty as default, otherwise popover won't show up + next: if i is @_options.steps.length - 1 then -1 else i + 1 + prev: i - 1 + animation: true + container: @_options.container + autoscroll: @_options.autoscroll + backdrop: @_options.backdrop + backdropContainer: @_options.backdropContainer + backdropPadding: @_options.backdropPadding + redirect: @_options.redirect + reflexElement: @_options.steps[i].element + backdropElement: @_options.steps[i].element + orphan: @_options.orphan + duration: @_options.duration + delay: @_options.delay + template: @_options.template + onShow: @_options.onShow + onShown: @_options.onShown + onHide: @_options.onHide + onHidden: @_options.onHidden + onNext: @_options.onNext + onPrev: @_options.onPrev + onPause: @_options.onPause + onResume: @_options.onResume + onRedirectError: @_options.onRedirectError + , @_options.steps[i] + + # Setup event bindings and continue a tour that has already started + init: (force) -> + @_force = force + + if @ended() + @_debug 'Tour ended, init prevented.' + return @ + + @setCurrentStep() + + @_initMouseNavigation() + @_initKeyboardNavigation() + + # Reshow popover on window resize using debounced resize + @_onResize => @showStep @_current + @_onScroll => @_showPopoverAndOverlay(@_current) + + # Continue a tour that had started on a previous page load + @showStep @_current unless @_current is null + + @_inited = true + @ + + # Start tour from current step + start: (force = false) -> + @init force unless @_inited # Backward compatibility + + if @_current is null + promise = @_makePromise(@_options.onStart(@) if @_options.onStart?) + @_callOnPromiseDone(promise, @showStep, 0) + @ + + # Hide current step and show next step + next: -> + promise = @hideStep @_current, @_current+1 + @_callOnPromiseDone promise, @_showNextStep + + # Hide current step and show prev step + prev: -> + promise = @hideStep @_current, @_current-1 + @_callOnPromiseDone promise, @_showPrevStep + + goTo: (i) -> + promise = @hideStep @_current, i + @_callOnPromiseDone promise, @showStep, i + + # End tour + end: -> + endHelper = (e) => + $(document).off "click.tour-#{@_options.name}" + $(document).off "keyup.tour-#{@_options.name}" + $(window).off "resize.tour-#{@_options.name}" + $(window).off "scroll.tour-#{@_options.name}" + @_setState('end', 'yes') + @_inited = false + @_force = false + + @_clearTimer() + + @_options.onEnd(@) if @_options.onEnd? + + promise = @hideStep(@_current) + @_callOnPromiseDone(promise, endHelper) + + # Verify if tour is enabled + ended: -> + not @_force and not not @_getState 'end' + + # Restart tour + restart: -> + @_removeState 'current_step' + @_removeState 'end' + @_removeState 'redirect_to' + @start() + + # Pause step timer + pause: -> + step = @getStep @_current + return @ unless step and step.duration + + @_paused = true + @_duration -= new Date().getTime() - @_start + window.clearTimeout(@_timer) + + @_debug "Paused/Stopped step #{@_current + 1} timer (#{@_duration} remaining)." + + step.onPause @, @_duration if step.onPause? + + # Resume step timer + resume: -> + step = @getStep @_current + return @ unless step and step.duration + + @_paused = false + @_start = new Date().getTime() + @_duration = @_duration or step.duration + @_timer = window.setTimeout => + if @_isLast() then @next() else @end() + , @_duration + + @_debug "Started step #{@_current + 1} timer with duration #{@_duration}" + + step.onResume @, @_duration if step.onResume? and @_duration isnt step.duration + + # Hide the specified step + hideStep: (i, iNext) -> + step = @getStep i + return unless step + + @_clearTimer() + + # If onHide returns a promise, let's wait until it's done to execute + promise = @_makePromise(step.onHide @, i if step.onHide?) + + hideStepHelper = (e) => + $element = $ step.element + $element = $('body') unless $element.data('bs.popover') or $element.data('popover') + $element + .popover('destroy') + .removeClass("tour-#{@_options.name}-element tour-#{@_options.name}-#{i}-element") + .removeData('bs.popover') + + if step.reflex + $ step.reflexElement + .removeClass('tour-step-element-reflex') + .off "#{@_reflexEvent(step.reflex)}.tour-#{@_options.name}" + + if step.backdrop + next_step = iNext? and @getStep iNext + if !next_step or !next_step.backdrop or next_step.backdropElement != step.backdropElement + @_hideOverlayElement(step) + + step.onHidden(@) if step.onHidden? + + hideDelay = step.delay.hide || step.delay + + if ({}).toString.call(hideDelay) is '[object Number]' and hideDelay > 0 + @_debug "Wait #{hideDelay} milliseconds to hide the step #{@_current + 1}" + window.setTimeout => + @_callOnPromiseDone promise, hideStepHelper + , hideDelay + else + @_callOnPromiseDone promise, hideStepHelper + + promise + + # Show the specified step + showStep: (i) -> + if @ended() + @_debug 'Tour ended, showStep prevented.' + return @ + + step = @getStep i + return unless step + + skipToPrevious = i < @_current + + # If onShow returns a promise, let's wait until it's done to execute + promise = @_makePromise(step.onShow @, i if step.onShow?) + + @setCurrentStep i + + # Support string or function for path + path = switch ({}).toString.call step.path + when '[object Function]' then step.path() + when '[object String]' then @_options.basePath + step.path + else step.path + + # Redirect to step path if not already there + if step.redirect and @_isRedirect step.host, path, document.location + @_redirect step, i, path + + return unless @_isJustPathHashDifferent(step.host, path, document.location) + + showStepHelper = (e) => + # Skip if step is orphan and orphan options is false + if @_isOrphan step + if step.orphan is false + @_debug """Skip the orphan step #{@_current + 1}. + Orphan option is false and the element does not exist or is hidden.""" + if skipToPrevious then @_showPrevStep() else @_showNextStep() + return + + @_debug "Show the orphan step #{@_current + 1}. Orphans option is true." + + # Show backdrop + # @_showBackdrop(step) if step.backdrop + + if step.autoscroll + @_scrollIntoView i + else + @_showPopoverAndOverlay i + + # Play step timer + @resume() if step.duration + + showDelay = step.delay.show || step.delay + + if ({}).toString.call(showDelay) is '[object Number]' and showDelay > 0 + @_debug "Wait #{showDelay} milliseconds to show the step #{@_current + 1}" + window.setTimeout => + @_callOnPromiseDone promise, showStepHelper + , showDelay + else + @_callOnPromiseDone promise, showStepHelper + + promise + + getCurrentStep: -> + @_current + + # Setup current step variable + setCurrentStep: (value) -> + if value? + @_current = value + @_setState 'current_step', value + else + @_current = @_getState 'current_step' + @_current = if @_current is null then null else parseInt @_current, 10 + @ + + # Manually trigger a redraw on the overlay element + redraw: -> + @_showOverlayElement(@getStep(@getCurrentStep())) + + # Set a state in storage + _setState: (key, value) -> + if @_options.storage + keyName = "#{@_options.name}_#{key}" + try @_options.storage.setItem keyName, value + catch e + if e.code is DOMException.QUOTA_EXCEEDED_ERR + @_debug 'LocalStorage quota exceeded. State storage failed.' + @_options.afterSetState keyName, value + else + @_state ?= {} + @_state[key] = value + + # Remove the current state from the storage layer + _removeState: (key) -> + if @_options.storage + keyName = "#{@_options.name}_#{key}" + @_options.storage.removeItem keyName + @_options.afterRemoveState keyName + else + delete @_state[key] if @_state? + + # Get the current state from the storage layer + _getState: (key) -> + if @_options.storage + keyName = "#{@_options.name}_#{key}" + value = @_options.storage.getItem keyName + else + value = @_state[key] if @_state? + + value = null if value is undefined or value is 'null' + + @_options.afterGetState key, value + return value + + # Show next step + _showNextStep: -> + step = @getStep @_current + showNextStepHelper = (e) => @showStep step.next + + promise = @_makePromise(step.onNext @ if step.onNext?) + @_callOnPromiseDone promise, showNextStepHelper + + # Show prev step + _showPrevStep: -> + step = @getStep @_current + showPrevStepHelper = (e) => @showStep step.prev + + promise = @_makePromise(step.onPrev @ if step.onPrev?) + @_callOnPromiseDone promise, showPrevStepHelper + + # Print message in console + _debug: (text) -> + window.console.log "Bootstrap Tour '#{@_options.name}' | #{text}" if @_options.debug + + # Check if step path equals current document path + _isRedirect: (host, path, location) -> + return true if host? and host isnt '' and ( + (({}).toString.call(host) is '[object RegExp]' and not host.test(location.origin)) or + (({}).toString.call(host) is '[object String]' and @_isHostDifferent(host, location)) + ) + + currentPath = [ + location.pathname, + location.search, + location.hash + ].join('') + + path? and path isnt '' and ( + (({}).toString.call(path) is '[object RegExp]' and not path.test(currentPath)) or + (({}).toString.call(path) is '[object String]' and @_isPathDifferent(path, currentPath)) + ) + + _isHostDifferent: (host, location) -> + switch ({}).toString.call(host) + when '[object RegExp]' + not host.test(location.origin) + when '[object String]' + @_getProtocol(host) isnt @_getProtocol(location.href) or + @_getHost(host) isnt @_getHost(location.href) + else + true + + _isPathDifferent: (path, currentPath) -> + @_getPath(path) isnt @_getPath(currentPath) or not + @_equal(@_getQuery(path), @_getQuery(currentPath)) or not + @_equal(@_getHash(path), @_getHash(currentPath)) + + _isJustPathHashDifferent: (host, path, location) -> + if host? and host isnt '' + return false if @_isHostDifferent(host, location) + + currentPath = [ + location.pathname, + location.search, + location.hash + ].join('') + + if ({}).toString.call(path) is '[object String]' + return @_getPath(path) is @_getPath(currentPath) and + @_equal(@_getQuery(path), @_getQuery(currentPath)) and not + @_equal(@_getHash(path), @_getHash(currentPath)) + + false + + # Execute the redirect + _redirect: (step, i, path) -> + if $.isFunction step.redirect + step.redirect.call this, path + else + href = if ({}).toString.call(step.host) is '[object String]' then "#{step.host}#{path}" else path + @_debug "Redirect to #{href}" + + if @_getState('redirect_to') is "#{i}" + @_debug "Error redirection loop to #{path}" + @_removeState 'redirect_to' + + step.onRedirectError @ if step.onRedirectError? + else + @_setState 'redirect_to', "#{i}" + document.location.href = href + + _isOrphan: (step) -> + # Do not check for is(':hidden') on svg elements. jQuery does not work properly on svg. + not step.element? or + not $(step.element).length or + $(step.element).is(':hidden') and + ($(step.element)[0].namespaceURI isnt 'http://www.w3.org/2000/svg') + + _isLast: -> + @_current < @_options.steps.length - 1 + + _showPopoverAndOverlay: (i) => + return if @getCurrentStep() isnt i or @ended() + + step = @getStep i + + @_showOverlayElement step if step.backdrop + @_showPopover step, i + step.onShown @ if step.onShown? + @_debug "Step #{@_current + 1} of #{@_options.steps.length}" + + # Show step popover + _showPopover: (step, i) -> + # Remove previously existing tour popovers. This prevents displaying of + # multiple inactive popovers when user navigates the tour too quickly. + $(".tour-#{@_options.name}").remove() + + options = $.extend {}, @_options + isOrphan = @_isOrphan step + + step.template = @_template step, i + + if isOrphan + step.element = 'body' + step.placement = 'top' + + $element = $ step.element + $element.addClass "tour-#{@_options.name}-element tour-#{@_options.name}-#{i}-element" + + $.extend options, step.options if step.options + if step.reflex and not isOrphan + $ step.reflexElement + .addClass('tour-step-element-reflex') + .off("#{@_reflexEvent(step.reflex)}.tour-#{@_options.name}") + .on "#{@_reflexEvent(step.reflex)}.tour-#{@_options.name}", => + if @_isLast() then @next() else @end() + + shouldAddSmart = step.smartPlacement is true and step.placement.search(/auto/i) is -1 + + $element + .popover( + placement: if shouldAddSmart then "auto #{step.placement}" else step.placement + trigger: 'manual' + title: step.title + content: step.content + html: true + animation: step.animation + container: step.container + template: step.template + selector: step.element + ) + .popover 'show' + + # Tip adjustment + $tip = if $element.data 'bs.popover' then $element.data('bs.popover').tip() else $element.data('popover').tip() + $tip.attr 'id', step.id + $tip.css 'position', 'fixed' if $element.css('position') is 'fixed' + + @_reposition($tip, step) + @_center($tip) if isOrphan + + # Get popover template + _template: (step, i) -> + template = step.template + + if @_isOrphan(step) and ({}).toString.call(step.orphan) isnt '[object Boolean]' + template = step.orphan + + $template = if $.isFunction template then $(template i, step) else $(template) + $navigation = $template.find '.popover-navigation' + $prev = $navigation.find '[data-role="prev"]' + $next = $navigation.find '[data-role="next"]' + $resume = $navigation.find '[data-role="pause-resume"]' + + $template.addClass 'orphan' if @_isOrphan step + $template.addClass "tour-#{@_options.name} tour-#{@_options.name}-#{i}" + $template.addClass "tour-#{@_options.name}-reflex" if step.reflex + + if step.prev < 0 + $prev.addClass('disabled') + .prop('disabled', true) + .prop('tabindex', -1) + + if step.next < 0 + $next.addClass('disabled') + .prop('disabled', true) + .prop('tabindex', -1) + + $resume.remove() unless step.duration + $template.clone().wrap('
').parent().html() + + _reflexEvent: (reflex) -> + if ({}).toString.call(reflex) is '[object Boolean]' then 'click' else reflex + + # Prevent popover from crossing over the edge of the window + _reposition: ($tip, step) -> + offsetWidth = $tip[0].offsetWidth + offsetHeight = $tip[0].offsetHeight + + tipOffset = $tip.offset() + originalLeft = tipOffset.left + originalTop = tipOffset.top + offsetBottom = $(document).outerHeight() - tipOffset.top - $tip.outerHeight() + tipOffset.top = tipOffset.top + offsetBottom if offsetBottom < 0 + offsetRight = $('html').outerWidth() - tipOffset.left - $tip.outerWidth() + tipOffset.left = tipOffset.left + offsetRight if offsetRight < 0 + + tipOffset.top = 0 if tipOffset.top < 0 + tipOffset.left = 0 if tipOffset.left < 0 + + $tip.offset(tipOffset) + + # Reposition the arrow + if step.placement is 'bottom' or step.placement is 'top' + if originalLeft isnt tipOffset.left + @_replaceArrow $tip, (tipOffset.left - originalLeft) * 2, offsetWidth, 'left' + else + if originalTop isnt tipOffset.top + @_replaceArrow $tip, (tipOffset.top - originalTop) * 2, offsetHeight, 'top' + + # Center popover in the page + _center: ($tip) -> + $tip.css('top', $(window).outerHeight() / 2 - $tip.outerHeight() / 2) + + # Copy pasted from bootstrap-tooltip.js with some alterations + _replaceArrow: ($tip, delta, dimension, position)-> + $tip.find('.arrow').css position, if delta then 50 * (1 - delta / dimension) + '%' else '' + + # Scroll to the popup if it is not in the viewport + _scrollIntoView: (i) -> + step = @getStep i + $element = $(step.element) + return @_showPopoverAndOverlay(i) unless $element.length + + $window = $(window) + offsetTop = $element.offset().top + height = $element.outerHeight() + windowHeight = $window.height() + scrollTop = 0 + + switch step.placement + when 'top' + scrollTop = Math.max(0, offsetTop - (windowHeight / 2)) + when 'left', 'right' + scrollTop = Math.max(0, (offsetTop + height / 2) - (windowHeight / 2)) + when 'bottom' + scrollTop = Math.max(0, (offsetTop + height) - (windowHeight / 2)) + + @_debug "Scroll into view. ScrollTop: #{scrollTop}. Element offset: #{offsetTop}. Window height: #{windowHeight}." + counter = 0 + $('body, html').stop(true, true).animate + scrollTop: Math.ceil(scrollTop), + => + if ++counter is 2 + @_showPopoverAndOverlay(i) + @_debug """Scroll into view. + Animation end element offset: #{$element.offset().top}. + Window height: #{$window.height()}.""" + + # Debounced window resize + _onResize: (callback, timeout) -> + $(window).on "resize.tour-#{@_options.name}", -> + clearTimeout(timeout) + timeout = setTimeout(callback, 100) + + # Debounced window scroll + _onScroll: (callback, timeout) -> + $(window).on "scroll.tour-#{@_options.name}", -> + clearTimeout(timeout) + timeout = setTimeout(callback, 100) + + # Event bindings for mouse navigation + _initMouseNavigation: -> + _this = @ + + # Go to next step after click on element with attribute 'data-role=next' + # Go to previous step after click on element with attribute 'data-role=prev' + # End tour after click on element with attribute 'data-role=end' + # Pause/resume tour after click on element with attribute 'data-role=pause-resume' + $(document) + .off("click.tour-#{@_options.name}", ".popover.tour-#{@_options.name} *[data-role='prev']") + .off("click.tour-#{@_options.name}", ".popover.tour-#{@_options.name} *[data-role='next']") + .off("click.tour-#{@_options.name}", ".popover.tour-#{@_options.name} *[data-role='end']") + .off("click.tour-#{@_options.name}", ".popover.tour-#{@_options.name} *[data-role='pause-resume']") + .on "click.tour-#{@_options.name}", ".popover.tour-#{@_options.name} *[data-role='next']", (e) => + e.preventDefault() + @next() + .on "click.tour-#{@_options.name}", ".popover.tour-#{@_options.name} *[data-role='prev']", (e) => + e.preventDefault() + @prev() if @_current > 0 + .on "click.tour-#{@_options.name}", ".popover.tour-#{@_options.name} *[data-role='end']", (e) => + e.preventDefault() + @end() + .on "click.tour-#{@_options.name}", ".popover.tour-#{@_options.name} *[data-role='pause-resume']", (e) -> + e.preventDefault() + $this = $ @ + + $this.text if _this._paused then $this.data 'pause-text' else $this.data 'resume-text' + if _this._paused then _this.resume() else _this.pause() + + # Keyboard navigation + _initKeyboardNavigation: -> + return unless @_options.keyboard + + $(document).on "keyup.tour-#{@_options.name}", (e) => + return unless e.which + + switch e.which + when 39 + e.preventDefault() + if @_isLast() then @next() else @end() + when 37 + e.preventDefault() + @prev() if @_current > 0 + + # Checks if the result of a callback is a promise + _makePromise: (result) -> + if result and $.isFunction(result.then) then result else null + + _callOnPromiseDone: (promise, cb, arg) -> + if promise + promise.then (e) => + cb.call(@, arg) + else + cb.call(@, arg) + + _showBackground: (step, data) -> + height = $(document).height() + width = $(document).width() + for pos in ['top', 'bottom', 'left', 'right'] + $backdrop = @backdrops[pos] ?= $('
', class: "tour-backdrop #{pos}") + $(step.backdropContainer).append($backdrop) + + switch pos + when 'top' + $backdrop + .height(if data.offset.top > 0 then data.offset.top else 0) + .width(width) + .offset(top: 0, left: 0) + when 'bottom' + $backdrop + .offset(top: data.offset.top + data.height, left: 0) + .height(height - (data.offset.top + data.height)) + .width(width) + when 'left' + $backdrop + .offset(top: data.offset.top, left: 0) + .height(data.height) + .width(if data.offset.left > 0 then data.offset.left else 0) + when 'right' + $backdrop + .offset(top: data.offset.top, left: data.offset.left + data.width) + .height(data.height) + .width(width - (data.offset.left + data.width)) + + _showOverlayElement: (step) -> + $backdropElement = $ step.backdropElement + + if $backdropElement.length is 0 + elementData = + width: 0 + height: 0 + offset: + top: 0 + left: 0 + else + elementData = + width: $backdropElement.innerWidth() + height: $backdropElement.innerHeight() + offset: $backdropElement.offset() + + $backdropElement.addClass 'tour-step-backdrop' + elementData = @_applyBackdropPadding step.backdropPadding, elementData if step.backdropPadding + + @_showBackground(step, elementData) + + _hideOverlayElement: (step) -> + $(step.backdropElement).removeClass 'tour-step-backdrop' + + for pos, $backdrop of @backdrops + $backdrop.remove() if $backdrop and $backdrop.remove isnt undefined + + @backdrops = [] + + _applyBackdropPadding: (padding, data) -> + if typeof padding is 'object' + padding.top ?= 0 + padding.right ?= 0 + padding.bottom ?= 0 + padding.left ?= 0 + + data.offset.top = data.offset.top - padding.top + data.offset.left = data.offset.left - padding.left + data.width = data.width + padding.left + padding.right + data.height = data.height + padding.top + padding.bottom + else + data.offset.top = data.offset.top - padding + data.offset.left = data.offset.left - padding + data.width = data.width + (padding * 2) + data.height = data.height + (padding * 2) + + data + + _clearTimer: -> + window.clearTimeout @_timer + @_timer = null + @_duration = null + + _getProtocol: (url) -> + url = url.split('://') + return if url.length > 1 then url[0] else 'http' + + _getHost: (url) -> + url = url.split('//') + url = if url.length > 1 then url[1] else url[0] + + return url.split('/')[0] + + _getPath: (path) -> + return path.replace(/\/?$/, '').split('?')[0].split('#')[0] + + _getQuery: (path) -> + return @_getParams(path, '?') + + _getHash: (path) -> + return @_getParams(path, '#') + + _getParams: (path, start) -> + params = path.split(start) + return {} if params.length is 1 + + params = params[1].split('&') + paramsObject = {} + + for param in params + param = param.split('=') + paramsObject[param[0]] = param[1] or '' + + return paramsObject + + _equal: (obj1, obj2) -> + if ({}).toString.call(obj1) is '[object Object]' and ({}).toString.call(obj2) is '[object Object]' + obj1Keys = Object.keys(obj1) + obj2Keys = Object.keys(obj2) + return false if obj1Keys.length isnt obj2Keys.length + + for k,v of obj1 + return false if not @_equal(obj2[k], v) + + return true + else if ({}).toString.call(obj1) is '[object Array]' and ({}).toString.call(obj2) is '[object Array]' + return false if obj1.length isnt obj2.length + + for v,k in obj1 + return false if not @_equal(v, obj2[k]) + + return true + else + return obj1 is obj2 + + Tour +) diff --git a/www/bootstrap-tour/src/coffee/bootstrap-tour.docs.coffee b/www/bootstrap-tour/src/coffee/bootstrap-tour.docs.coffee new file mode 100755 index 00000000..ee141781 --- /dev/null +++ b/www/bootstrap-tour/src/coffee/bootstrap-tour.docs.coffee @@ -0,0 +1,95 @@ +$ -> + $demo = $("#demo") + duration = 5000 + remaining = duration + tour = new Tour( + onStart: -> $demo.addClass "disabled", true + onEnd: -> $demo.removeClass "disabled", true + debug: true + steps: [ + path: "/" + element: "#navbar" + placement: "bottom" + title: "Welcome to Bootstrap Tour!" + content: """ + Introduce new users to your product by walking them through it step by step. + """ + , + path: "/" + element: "#usage" + placement: "top" + title: "A super simple setup" + content: "Easy is better, right? The tour is up and running with just a + few options and steps." + , + path: "/" + element: "#license" + placement: "top" + title: "Best of all, it's free!" + content: "Yeah! Free as in beer... or speech. Use and abuse, but don't forget to contribute!" + , + path: "/api" + element: "#options" + placement: "top" + title: "Flexibilty and expressiveness" + content: """ + There are more options for those who want to get on the dark side.
+ Power to the people! + """ + reflex: true + , + path: "/api" + element: "#duration" + placement: "top" + title: "Automagically expiring step", + content: """ + A new addition: make your tour (or step) completely automatic. You set the duration, Bootstrap + Tour does the rest. For instance, this step will disappear in 5 seconds. + """ + duration: 5000 + , + path: "/api" + element: "#methods table" + placement: "top" + title: "A new shiny Backdrop option" + content: """ + If you need to highlight the current step's element, activate the backdrop and you won't lose + focus anymore! + """ + backdrop: true + backdropPadding: 5 + , + path: "/api" + element: "#reflex" + placement: "bottom" + title: "Reflex mode" + content: "Reflex mode is enabled, click on the text in the cell to continue!" + reflex: true + , + path: "/api" + title: "And support for orphan steps" + content: """ + If you activate the orphan property, the step(s) are shown centered in the page, and you can + forget to specify element and placement! + """ + orphan: true + onHidden: -> window.location.assign "/" + ] + ) + .init() + + $('
You ended the demo tour. Restart the demo tour.
').prependTo(".content").alert() if tour.ended() + + $(document).on "click", "[data-demo]", (e) -> + e.preventDefault() + return if $(this).hasClass "disabled" + tour.restart() + $(".alert").alert "close" + + $("html").smoothScroll() + + $(".gravatar").each -> + $this = $(@) + email = md5 $this.data "email" + + $(@).attr "src", "http://www.gravatar.com/avatar/#{email}?s=60" diff --git a/www/bootstrap-tour/src/coffee/bootstrap-tour.spec.coffee b/www/bootstrap-tour/src/coffee/bootstrap-tour.spec.coffee new file mode 100755 index 00000000..a3cf5a6b --- /dev/null +++ b/www/bootstrap-tour/src/coffee/bootstrap-tour.spec.coffee @@ -0,0 +1,1274 @@ +describe 'Bootstrap Tour', -> + + beforeEach -> + $.support.transition = false + $.fx.off = true + + afterEach -> + tour = @tour + @tour._setState('current_step', null) + @tour._setState('end', null) + $.each @tour._options.steps, (i, s) -> + $element = $(tour.getStep(i).element) + + $element + .popover('destroy') + .removeData('bs.popover') + $element.remove() + + it 'should set the tour options', -> + @tour = new Tour + name: 'test' + afterSetState: -> true + afterGetState: -> true + expect(@tour._options.name).toBe 'test' + expect(@tour._options.afterGetState).toBeTruthy + expect(@tour._options.afterSetState).toBeTruthy + + it 'should have `tour` as default name', -> + @tour = new Tour + expect(@tour._options.name).toBe 'tour' + + it 'should accept an array of steps', -> + @tour = new Tour + expect(@tour._options.steps).toEqual [] # tour accepts an array of steps + + it '`_setState` should save state as localStorage item', -> + @tour = new Tour + @tour._setState('test', 'yes') + expect(window.localStorage.getItem('tour_test')).toBe 'yes' + + it '`_setState` should execute storage.setItem function if provided', -> + aliasKeyName = undefined + aliasValue = undefined + + @tour = new Tour + name: 'test' + storage: + setItem: (keyName, value) -> + aliasKeyName = keyName + aliasValue = value + getItem: (value) -> + return aliasValue + + @tour._setState('save', 'yes') + expect(aliasKeyName).toBe 'test_save' + expect(aliasValue).toBe 'yes' + + it '`_setState` should save state internally if storage is false', -> + @tour = new Tour + storage: false + @tour._setState('test', 'yes') + expect(@tour._state['test']).toBe 'yes' + + it '`_removeState` should remove state localStorage item', -> + @tour = new Tour + @tour._setState('test', 'yes') + @tour._removeState('test') + expect(window.localStorage.getItem('tour_test')).toBe null + + it '`_removeState` should remove state internally if storage is false', -> + @tour = new Tour + storage: false + @tour._setState('test', 'yes') + @tour._removeState('test') + expect(@tour._state['test']).toBeUndefined() + + it '`_getState` should get state localStorage items', -> + @tour = new Tour + @tour._setState('test', 'yes') + expect(@tour._getState('test')).toBe 'yes' + window.localStorage.setItem('tour_test', null) + + it '`_getState` should get the internal state if storage is false', -> + @tour = new Tour + storage: false + @tour._setState('test', 'yes') + expect(@tour._getState('test')).toBe 'yes' + + it '`addStep` should add a step', -> + @tour = new Tour + step = element: $('
').appendTo('body') + @tour.addStep(step) + expect(@tour._options.steps).toEqual [step] + + it '`addSteps` should add multiple step', -> + @tour = new Tour + firstStep = element: $('
').appendTo('body') + secondStep = element: $('
').appendTo('body') + @tour.addSteps([firstStep, secondStep]) + expect(@tour._options.steps).toEqual [firstStep, secondStep] + + it 'step should have an id', -> + @tour = new Tour + $element = $('
').appendTo('body') + @tour.addStep({element: $element}) + @tour.start() + expect($element.data('bs.popover').tip().attr('id')).toBe 'step-0' # tour runs onStart when the first step shown + + it 'with `onStart` option should run the callback before showing the first step', -> + tour_test = 0 + @tour = new Tour + onStart: -> tour_test += 2 + @tour.addStep(element: $('
').appendTo('body')) + @tour.start() + expect(tour_test).toBe 2 # tour runs onStart when the first step shown + + it 'with `onEnd` option should run the callback after hiding the last step', -> + tour_test = 0 + @tour = new Tour + onEnd: -> tour_test += 2 + @tour.addStep(element: $('
').appendTo('body')) + @tour.start() + @tour.end() + expect(tour_test).toBe 2 # tour runs onEnd when the last step hidden + + it 'with `onShow` option should run the callback before showing the step', -> + tour_test = 0 + @tour = new Tour + onShow: -> tour_test += 2 + @tour.addStep(element: $('
').appendTo('body')) + @tour.addStep(element: $('
').appendTo('body')) + @tour.start() + expect(tour_test).toBe 2 # tour runs onShow when first step shown + @tour.next() + expect(tour_test).toBe 4 # tour runs onShow when next step shown + + it 'with `onShown` option should run the callback after showing the step', -> + tour_test = 0 + @tour = new Tour + onShown: -> tour_test += 2 + @tour.addStep(element: $('
').appendTo('body')) + @tour.addStep(element: $('
').appendTo('body')) + @tour.start() + expect(tour_test).toBe 2 # tour runs onShown after first step shown + + + it 'with `onHide` option should run the callback before hiding the step', -> + tour_test = 0 + @tour = new Tour + onHide: -> tour_test += 2 + @tour.addStep(element: $('
').appendTo('body')) + @tour.addStep(element: $('
').appendTo('body')) + @tour.start() + @tour.next() + expect(tour_test).toBe 2 # tour runs onHide when first step hidden + @tour.hideStep(1) + expect(tour_test).toBe 4 # tour runs onHide when next step hidden + + it 'with onHidden option should run the callback after hiding the step', -> + tour_test = 0 + @tour = new Tour + onHidden: -> tour_test += 2 + @tour.addStep(element: $('
').appendTo('body')) + @tour.addStep(element: $('
').appendTo('body')) + @tour.start() + @tour.next() + expect(tour_test).toBe 2 # tour runs onHidden after first step hidden + @tour.next() + expect(tour_test).toBe 4 # tour runs onHidden after next step hidden + + it '`addStep` with onShow option should run the callback before showing the step', -> + tour_test = 0 + @tour = new Tour + @tour.addStep(element: $('
').appendTo('body')) + @tour.addStep + element: $('
').appendTo('body') + onShow: -> tour_test = 2 + @tour.start() + expect(tour_test).toBe 0 # tour does not run onShow when step not shown + @tour.next() + expect(tour_test).toBe 2 # tour runs onShow when step shown + + it '`addStep` with onHide option should run the callback before hiding the step', -> + tour_test = 0 + @tour = new Tour + @tour.addStep(element: $('
').appendTo('body')) + @tour.addStep + element: $('
').appendTo('body') + onHide: -> tour_test = 2 + @tour.start() + @tour.next() + expect(tour_test).toBe 0 # tour does not run onHide when step not hidden + @tour.hideStep(1) + expect(tour_test).toBe 2 # tour runs onHide when step hidden + + it '`getStep` should get a step', -> + @tour = new Tour + step = + element: $('
').appendTo('body') + id: 'step-0' + path: 'test' + host: '' + placement: 'left' + title: 'Test' + content: 'Just a test' + next: 2 + prev: -1 + animation: false + autoscroll: true + container: 'body' + backdrop: false + backdropPadding: 0 + backdropContainer: 'body' + backdropElement: $('
').appendTo('body') + redirect: true + reflexElement: $('
').appendTo('body') + orphan: false + duration: false + delay: false + template: '
+
+

+
+ +
' + onShow: (tour) -> + onShown: (tour) -> + onHide: (tour) -> + onHidden: (tour) -> + onNext: (tour) -> + onPrev: (tour) -> + onPause: (tour) -> + onResume: (tour) -> + onRedirectError: (tour) -> + @tour.addStep(step) + # remove properties that we don't want to check from both steps object + expect(@tour.getStep(0)).toEqual step + + it '`start` should start a tour', -> + @tour = new Tour + @tour.addStep(element: $('
').appendTo('body')) + @tour.start() + expect($('.popover').length).toBe 1 + + it '`init` should continue a tour', -> + @tour = new Tour + @tour.addStep(element: $('
').appendTo('body')) + @tour._setState('current_step', 0) + @tour.init() + expect($('.popover').length).toBe 1 + + it '`init` should not continue a tour that ended', -> + @tour = new Tour + @tour.addStep(element: $('
').appendTo('body')) + @tour._setState('current_step', 0) + @tour._setState('end', 'yes') + @tour.init() + expect($('.popover').length).toBe 0 # previously ended tour don't start again + + it '`init`(true) should force continuing a tour that ended', -> + @tour = new Tour + @tour.addStep(element: $('
').appendTo('body')) + @tour._setState('current_step', 0) + @tour._setState('end', 'yes') + @tour.init(true) + expect($('.popover').length).toBe 1 # previously ended tour starts again if forced to + + it '`next` should hide current step and show next step', -> + @tour = new Tour + @tour.addStep(element: $('
').appendTo('body')) + @tour.addStep(element: $('
').appendTo('body')) + @tour.start() + @tour.next() + expect(@tour.getStep(0).element.data('bs.popover')).toBeUndefined() # tour hides current step + expect(@tour.getStep(1).element.data('bs.popover').tip().filter(':visible').length).toBe 1 # tour shows next step + + it '`end` should hide current step and set end state', -> + @tour = new Tour + @tour.addStep(element: $('
').appendTo('body')) + @tour.start() + @tour.end() + expect(@tour.getStep(0).element.data('bs.popover')).toBeUndefined() # tour hides current step + expect(@tour._getState('end')).toBe 'yes' + + it '`ended` should return true if tour ended and false if not', -> + @tour = new Tour + @tour.addStep(element: $('
').appendTo('body')) + @tour.start() + expect(@tour.ended()).toBe false + @tour.end() + expect(@tour.ended()).toBe true + + it '`ended` should always return false if tour started by force', -> + @tour = new Tour + @tour.addStep(element: $('
').appendTo('body')) + @tour.end() + @tour.start(true) + expect(@tour.ended()).toBe false + + it '`restart` should clear all states and start tour', -> + @tour = new Tour + @tour.addStep(element: $('
').appendTo('body')) + @tour.addStep(element: $('
').appendTo('body')) + @tour.start() + @tour.next() + @tour.end() + @tour.restart() + expect(@tour._getState('end')).toBe null + expect(@tour._current).toBe 0 + expect($('.popover').length).toBe 1 # tour starts + + it '`hideStep` should hide a step', -> + @tour = new Tour + @tour.addStep(element: $('
').appendTo('body')) + @tour.start() + @tour.hideStep(0) + expect(@tour.getStep(0).element.data('bs.popover')).toBeUndefined() + + it '`showStep` should set a step and show it', -> + @tour = new Tour + @tour.addStep(element: $('
').appendTo('body')) + @tour.addStep(element: $('
').appendTo('body')) + @tour.showStep(1) + expect(@tour._current).toBe 1 + expect($('.popover').length).toBe 1 # tour shows one step + expect(@tour.getStep(1).element.data('bs.popover').tip().filter(':visible').length).toBe 1 # tour shows correct step + + it '`showStep` should not show anything when the step does not exist', -> + @tour = new Tour + @tour.addStep(element: $('
').appendTo('body')) + @tour.addStep(element: $('
').appendTo('body')) + @tour.showStep(2) + expect($('.popover').length).toBe 0 + + it '`showStep` should execute template if it is a function', -> + @tour = new Tour + @tour.addStep + element: $('
').appendTo('body') + template: -> '
' + @tour.showStep(0) + expect($('.popover').length).toBe 1 + + it '`getStep` should add disabled classes to the first and last popover buttons', -> + @tour = new Tour + @tour.addStep(element: $('
').appendTo('body')) + @tour.addStep(element: $('
').appendTo('body')) + @tour.showStep(0) + expect($('.popover [data-role="prev"]').hasClass('disabled')).toBe true + @tour.showStep(1) + expect($('.popover [data-role="next"]').hasClass('disabled')).toBe true + + it '`setCurrentStep` should set the current step', -> + @tour = new Tour + @tour.setCurrentStep(4) + expect(@tour._current).toBe 4 # tour sets current step if passed a value + @tour._setState('current_step', 2) + @tour.setCurrentStep() + expect(@tour._current).toBe 2 # tour reads current step state if not passed a value + + it '`goTo` should show the specified step', -> + @tour = new Tour + @tour.addStep({element: $('
').appendTo('body')}) + @tour.addStep({element: $('
').appendTo('body')}) + @tour.goTo(1) + expect(@tour.getStep(1).element.data('bs.popover').tip().filter(':visible').length).toBe 1 + + it '`next` should show the next step', -> + @tour = new Tour + @tour.addStep(element: $('
').appendTo('body')) + @tour.addStep(element: $('
').appendTo('body')) + @tour.start() + @tour.next() + expect(@tour.getStep(1).element.data('bs.popover').tip().filter(':visible').length).toBe 1 + + it '`prev` should show the previous step', -> + @tour = new Tour + @tour.addStep({element: $('
').appendTo('body')}) + @tour.addStep({element: $('
').appendTo('body')}) + @tour.goTo(1) + @tour.prev() + expect(@tour.getStep(0).element.data('bs.popover').tip().filter(':visible').length).toBe 1 + + it '`showStep` should show multiple step on the same element', -> + @tour = new Tour + @tour.addStep(element: $('
').appendTo('body')) + @tour.addStep(element: $('
').appendTo('body')) + @tour.start() + + # tour show the first step + expect(@tour.getStep(0).element.data('bs.popover').tip().filter(':visible').length).toBe 1 + @tour.next() + + # tour show the second step on the same element + expect(@tour.getStep(1).element.data('bs.popover').tip().filter(':visible').length).toBe 1 + + it 'should get url properties correctly', -> + @tour = new Tour + + expect(@tour._getProtocol('http://example.com')).toBe 'http' + expect(@tour._getProtocol('https://example.com')).toBe 'https' + expect(@tour._getProtocol('www.example.com')).toBe 'http' + expect(@tour._getProtocol('example.com')).toBe 'http' + + expect(@tour._getHost('http://example.com')).toBe 'example.com' + expect(@tour._getHost('www.example.com')).toBe 'www.example.com' + expect(@tour._getHost('example.com/path')).toBe 'example.com' + + expect(@tour._getPath('/somepath?foo=bar')).toBe '/somepath' + expect(@tour._getPath('/somepath#foo=bar')).toBe '/somepath' + expect(@tour._getPath('/somepath?foo=bar#hash')).toBe '/somepath' + + expect(@tour._getQuery('/somepath?one=bar')).toEqual {one: 'bar'} + expect(@tour._getQuery('/somepath?one=bar&two=foo')).toEqual {one: 'bar', two: 'foo'} + + expect(@tour._getHash('/somepath#one=bar&two=foo')).toEqual {one: 'bar', two: 'foo'} + expect(@tour._getHash('/somepath#one=bar&two=foo')).toEqual {one: 'bar', two: 'foo'} + + it 'should evaluate `path` correctly', -> + @tour = new Tour + + # redirect if path doesn't match current path + expect( + @tour._isRedirect( + '', '/anotherpath', + { + origin: '' + href: '' + pathname: '/somepath' + search: '' + hash: '' + } + ) + ).toBe true + # don't redirect if no path + expect( + @tour._isRedirect( + '', undefined, + { + origin: '' + href: '' + pathname: '/' + search: '' + hash: '' + } + ) + ).toBe false + # don't redirect if path empty + expect( + @tour._isRedirect( + '', '', + { + origin: '' + href: '' + pathname: '/' + search: '' + hash: '' + } + ) + ).toBe false + # don't redirect if path matches current path + expect( + @tour._isRedirect( + '', '/somepath', + { + origin: '' + href: '' + pathname: '/somepath' + search: '' + hash: '' + } + ) + ).toBe false + # don't redirect if path with slash matches current path + expect( + @tour._isRedirect( + '', '/somepath/', + { + origin: '' + href: '' + pathname: '/somepath' + search: '' + hash: '' + } + ) + ).toBe false + # don't redirect if path matches current path with slash + expect( + @tour._isRedirect( + '', '/somepath', + { + origin: '' + href: '' + pathname: '/somepath/' + search: '' + hash: '' + } + ) + ).toBe false + # redirect if path with query params doesn't matche current path + expect( + @tour._isRedirect( + '', '/somepath?search=true', + { + origin: '' + href: '' + pathname: '/somepath' + search: '' + hash: '' + } + ) + ).toBe true + # redirect if path with slash and query params doesn't matche current path + expect( + @tour._isRedirect( + '', '/somepath/?search=true', + { + origin: '' + href: '' + pathname: '/somepath' + search: '' + hash: '' + } + ) + ).toBe true + + # redirect if path with more than one query param doesn't matche current path + expect( + @tour._isRedirect( + '', '/somepath?search=true&foo=bar', + { + origin: '' + href: '' + pathname: '/somepath' + search: '' + hash: '' + } + ) + ).toBe true + + # redirect if path with and query params doesn't matche current path + expect( + @tour._isRedirect( + '', '/somepath?search=true&foo=bar', + { + origin: '' + href: '' + pathname: '/somepath' + search: '?search=true' + hash: '' + } + ) + ).toBe true + + # redirect if path query params number doesn't matche current path + expect( + @tour._isRedirect( + '', '/somepath?search=true&foo=bar', + { + origin: '' + href: '' + pathname: '/somepath' + search: '?foo=bar' + hash: '' + } + ) + ).toBe true + + # don't redirect if path with query params matches current path + expect( + @tour._isRedirect( + '', '/somepath?search=true&foo=bar', + { + origin: '' + href: '' + pathname: '/somepath' + search: '?foo=bar&search=true' + hash: '' + } + ) + ).toBe false + + # don't redirect if path with query params matches current path + expect( + @tour._isRedirect( + '', '/somepath?search=true&foo=bar' + { + origin: '' + href: '' + pathname: '/somepath' + search: '?search=true&foo=bar' + hash:'' + } + ) + ).toBe false + + # redirect if path with one hash param doesn't matche current path + expect( + @tour._isRedirect( + '', '/somepath#search=true', + { + origin: '' + href: '' + pathname: '/somepath' + search: '' + hash: '' + } + ) + ).toBe true + + # redirect if path with slash and one hash param doesn't matche current path + expect( + @tour._isRedirect( + '', '/somepath/#search=true', + { + origin: '' + href: '' + pathname: '/somepath' + search: '' + hash: '' + } + ) + ).toBe true + + # redirect if path with more than one hash params doesn't matche current path + expect( + @tour._isRedirect( + '', '/somepath#search=true&foo=bar', + { + origin: '' + href: '' + pathname: '/somepath' + search: '' + hash: '' + } + ) + ).toBe true + + # redirect if path hash params number doesn't matche current path + expect( + @tour._isRedirect( + '', '/somepath#search=true&foo=bar', + { + origin: '' + href: '' + pathname: '/somepath' + search: '' + hash: '#search=true' + } + ) + ).toBe true + + # redirect if path hash params number doesn't matche current path + expect( + @tour._isRedirect( + '', '/somepath#search=true&foo=bar', + { + origin: '', + href: '', + pathname: '/somepath', + search: '', + hash: '#foo=bar' + } + ) + ).toBe true + + # don't redirect if path with hash params matches current path + expect( + @tour._isRedirect( + '', '/somepath#search=true&foo=bar', + { + origin: '', + href: '', + pathname: '/somepath', + search: '', + hash: '#foo=bar&search=true' + } + ) + ).toBe false + + # don't redirect if path with hash params matches current path + expect( + @tour._isRedirect( + '', '/somepath#search=true&foo=bar', + { + origin: '', + href: '', + pathname: '/somepath', + search: '', + hash: '#search=true&foo=bar' + } + ) + ).toBe false + + # don't redirect if current path matches path regex + expect( + @tour._isRedirect( + '', /some.*/, + { + origin: '', + href: '', + pathname: '/somepath', + search: '', + hash: '' + } + ) + ).toBe false + + it '`_getState` should return null after `_removeState` with null value', -> + @tour = new Tour + @tour._setState('test', 'test') + @tour._removeState('test') + expect(@tour._getState('test')).toBe null + + it '`_removeState` should call `afterRemoveState` callback', -> + sentinel = false + @tour = new Tour + afterRemoveState: -> sentinel = true + @tour._removeState('current_step') + expect(sentinel).toBe true + + it 'should not move to the next state until the onShow promise is resolved', -> + @tour = new Tour + deferred = $.Deferred() + @tour.addStep(element: $('
').appendTo('body')) + @tour.addStep + element: $('
').appendTo('body') + onShow: -> return deferred + @tour.start() + @tour.next() + expect(@tour.getStep(0).element.data('bs.popover')).toBeUndefined + deferred.resolve() + expect(@tour.getStep(1).element.data('bs.popover').tip().filter(':visible').length).toBe 1 + + it 'should not hide popover until the onHide promise is resolved', -> + deferred = $.Deferred() + @tour = new Tour + @tour.addStep + element: $('
').appendTo('body') + onHide: -> return deferred + @tour.addStep(element: $('
').appendTo('body')) + @tour.start() + @tour.next() + expect(@tour._current).toBe 0 # tour shows old state until resolving of onHide promise + deferred.resolve() + expect(@tour._current).toBe 1 # tour shows new state after resolving onShow promise + + it 'should not start until the onStart promise is resolved', -> + deferred = $.Deferred() + @tour = new Tour + onStart: -> deferred + @tour.addStep(element: $('
').appendTo('body')) + @tour.start() + expect($('.popover').length).toBe 0 + deferred.resolve() + expect($('.popover').length).toBe 1 + + it 'should add `tour-step-element-reflex` class to the step element if reflex is active', -> + @tour = new Tour + $element = $('
').appendTo('body') + @tour.addStep + element: $element + reflex: true + @tour.addStep(element: $('
').appendTo('body')) + expect($element.hasClass('tour-step-element-reflex')).toBe false + @tour.start() + expect($element.hasClass('tour-step-element-reflex')).toBe true + @tour.next() + expect($element.hasClass('tour-step-element-reflex')).toBe false + + it 'should add `tour-step-element-reflex` class to reflexElement if reflex is defined', -> + @tour = new Tour + $element = $('
').appendTo('body') + $definedElement = $('
').appendTo('body') + @tour.addStep + element: $element + reflex: true + reflexElement: '#ref' + @tour.addStep(element: $('
').appendTo('body')) + expect($element.hasClass('tour-step-element-reflex')).toBe false + expect($definedElement.hasClass('tour-step-element-reflex')).toBe false + @tour.start() + expect($element.hasClass('tour-step-element-reflex')).toBe false + expect($definedElement.hasClass('tour-step-element-reflex')).toBe true + @tour.next() + expect($element.hasClass('tour-step-element-reflex')).toBe false + expect($definedElement.hasClass('tour-step-element-reflex')).toBe false + + it 'should add `tour-{tourName}-reflex` class to the step popover if reflex is active', -> + @tour = new Tour + $element = $('
').appendTo('body') + @tour.addStep + element: $element + reflex: true + @tour.addStep(element: $('
').appendTo('body')) + expect($('.popover').hasClass("tour-#{@tour._options.name}-reflex")).toBe false + @tour.start() + expect($('.popover').hasClass("tour-#{@tour._options.name}-reflex")).toBe true + @tour.next() + expect($('.popover').hasClass("tour-#{@tour._options.name}-reflex")).toBe false + + it '`showStep` redirects to the anchor when the path is an anchor', -> + @tour = new Tour + @tour.addStep + element: $('
').appendTo('body') + path: '#mytest' + @tour.showStep(0) + expect(document.location.hash).toBe '#mytest' # Tour step has moved to the anchor + document.location.hash = '' + + it '`showStep` show the step when the path is an anchor', -> + current_path = location.pathname + @tour = new Tour + @tour.addStep + element: $('
').appendTo('body') + path: "#{current_path}#mytest" + @tour.showStep(0) + expect(@tour.getStep(0).element.data('bs.popover').tip().filter(':visible').length).toBe 1 # tour shows correct step + document.location.hash = '' + + it '`backdrop` parameter should show backdrop with step', -> + @tour = new Tour + @tour.addStep + element: $('
').appendTo('body') + backdrop: false + @tour.addStep + element: $('
').appendTo('body') + backdrop: true + @tour.start() + expect($('.tour-backdrop').length).toBe 0 # disable backdrop + expect($('.tour-step-backdrop').length).toBe 0 # disable backdrop + @tour.next() + expect($('.tour-backdrop').length).toBe 4 # enable backdrop + expect($('.tour-step-backdrop').length).toBe 1 # enable backdrop + @tour.end() + expect($('.tour-backdrop').length).toBe 0 # disable backdrop + expect($('.tour-step-backdrop').length).toBe 0 # disable backdrop + + it 'step with backdrop and invalid selector should not attempt to create an overlay element', -> + @tour = new Tour + @tour._showOverlayElement backdropElement: '#nonExistingElement' + expect($('.tour-backdrop').length).toBe 0 + + it 'should render the padding on the backdrop element', -> + @tour = new Tour + backdrop: true + $firstElement = $('
', width: 10, height: 10).appendTo('body') + $secondElement = $('
').css( + position: 'absolute' + top: 100 + left: 300 + width: 10 + height: 10 + ).appendTo('body') + + firstPadding = 20 + secondPadding = + top: 40 + right: 30 + bottom: 20 + left: 10 + + @tour.addStep + backdrop: true + backdropPadding: firstPadding + element: $firstElement + @tour.addStep + backdrop: true + backdropPadding: secondPadding + element: $secondElement + @tour.start() + expect(@tour.backdrops.top.offset().top + @tour.backdrops.top.height()) + .toBe 0 + + expect(@tour.backdrops.left.offset().top) + .toBe $firstElement.offset().top - firstPadding + expect(@tour.backdrops.left.offset().top + @tour.backdrops.left.height()) + .toBe $firstElement.offset().top + $firstElement.height() + firstPadding + expect(@tour.backdrops.left.offset().left + @tour.backdrops.left.width()) + .toBe 0 + + expect(@tour.backdrops.bottom.offset().top) + .toBe $firstElement.offset().top + $firstElement.height() + firstPadding + + expect(@tour.backdrops.right.offset().top) + .toBe $firstElement.offset().top - firstPadding + expect(@tour.backdrops.right.offset().top + @tour.backdrops.right.height()) + .toBe $firstElement.offset().top + $firstElement.height() + firstPadding + expect(@tour.backdrops.right.offset().left) + .toBe $firstElement.offset().left + $firstElement.width() + firstPadding + + @tour.next() + expect(@tour.backdrops.top.offset().top + @tour.backdrops.top.height()) + .toBe $secondElement.offset().top - secondPadding.top + + expect(@tour.backdrops.left.offset().top) + .toBe $secondElement.offset().top - secondPadding.top + expect(@tour.backdrops.left.offset().top + @tour.backdrops.left.height()) + .toBe $secondElement.offset().top + $secondElement.height() + secondPadding.bottom + expect(@tour.backdrops.left.offset().left + @tour.backdrops.left.width()) + .toBe $secondElement.offset().left - secondPadding.left + + expect(@tour.backdrops.bottom.offset().top) + .toBe $secondElement.offset().top + $secondElement.height() + secondPadding.bottom + + expect(@tour.backdrops.right.offset().top) + .toBe $secondElement.offset().top - secondPadding.top + expect(@tour.backdrops.right.offset().top + @tour.backdrops.right.height()) + .toBe $secondElement.offset().top + $secondElement.height() + secondPadding.bottom + expect(@tour.backdrops.right.offset().left) + .toBe $secondElement.offset().left + $secondElement.width() + secondPadding.right + + it '`basePath` should prepend the path to the steps', -> + @tour = new Tour + basePath: 'test/' + @tour.addStep + element: $('
').appendTo('body') + path: 'test.html' + + # Tour adds basePath to step path + expect( + @tour._isRedirect( + @tour.getStep(0).host, + @tour._options.basePath + @tour.getStep(0).path, + href: '', pathname: 'test/test.html', search: '', hash: '' + ) + ).toBe false + + it 'should evaluate the host correctly', -> + @tour = new Tour + + expect( + @tour._isRedirect( + 'http://sub.exemple.com', + '/test.html', + { + origin: 'http://exemple.com' + href: 'http://exemple.com/test.html' + pathname: '/test.html' + search: '' + hash: '' + } + ) + ).toBe true + + expect( + @tour._isRedirect( + 'http://sub.exemple.com', + '/test.html', + { + origin: 'http://sub.exemple.com' + href: 'http://sub.exemple.com/test.html' + pathname: '/test.html' + search: '' + hash: '' + } + ) + ).toBe false + + expect( + @tour._isRedirect( + /http:\/\/.*\.exemple\.com/, + '/test.html', + { + origin: 'http://sub.exemple.com' + href: 'http://sub.exemple.com/test.html' + pathname: '/test.html' + search: '' + hash: '' + } + ) + ).toBe false + + expect( + @tour._isRedirect( + /http:\/\/exemple\.com/, + '/test.html', + { + origin: 'http://sub.exemple.com' + href: 'http://sub.exemple.com/test.html' + pathname: '/test.html' + search: '' + hash: '' + } + ) + ).toBe true + + it 'with `onNext` option should run the callback before showing the next step', -> + tour_test = 0 + @tour = new Tour + onNext: -> tour_test += 2 + @tour.addStep(element: $('
').appendTo('body')) + @tour.addStep(element: $('
').appendTo('body')) + @tour.start() + @tour.next() + expect(tour_test).toBe 2 + + it '`showStep` should not show step if tour ended', -> + @tour = new Tour + onNext: (t) -> t.end() + @tour.addStep(element: $('
').appendTo('body')) + @tour.addStep(element: $('
').appendTo('body')) + @tour.start() + @tour.next() + expect($('.popover').length).toBe 0 + + it '`addStep` with onNext option should run the callback before showing the next step', -> + tour_test = 0 + @tour = new Tour + @tour.addStep + element: $('
').appendTo('body') + onNext: -> tour_test = 2 + @tour.addStep(element: $('
').appendTo('body')) + @tour.start() + expect(tour_test).toBe 0 # tour does not run onNext when next step is not called + @tour.next() + expect(tour_test).toBe 2 # tour runs onNext when next step is called + + it 'with `onPrev` option should run the callback before showing the prev step', -> + tour_test = 0 + @tour = new Tour + onPrev: -> tour_test += 2 + @tour.addStep(element: $('
').appendTo('body')) + @tour.addStep(element: $('
').appendTo('body')) + @tour.start() + @tour.next() + @tour.prev() + expect(tour_test).toBe 2 # tour runs onPrev when prev step is called + + it '`addStep` with `onPrev` option should run the callback before showing the prev step', -> + tour_test = 0 + @tour = new Tour + @tour.addStep(element: $('
').appendTo('body')) + @tour.addStep + element: $('
').appendTo('body') + onPrev: -> tour_test = 2 + @tour.start() + expect(tour_test).toBe 0 # tour does not run onPrev when prev step is not called + @tour.next() + @tour.prev() + expect(tour_test).toBe 2 # tour runs onPrev when prev step is called + + it 'with `onRedirectError` option should run the callback when redirection failed', -> + tour_test = 0 + @tour = new Tour + @tour.addStep + element: $('
').appendTo('body') + path: '/path' + onRedirectError: -> tour_test = 2 + + @tour._setState 'redirect_to', 0 # tour has previously redirected to step '0' + @tour.start() + expect(tour_test).toBe 2 # tour runs onRedirectError when redirection failed + + it 'should render custom navigation template', -> + @tour = new Tour + template: + '
+
+

+
+
+ + + +
+
' + @tour.addStep(element: $('
').appendTo('body')) + @tour.addStep(element: $('
').appendTo('body')) + @tour.addStep(element: $('
').appendTo('body')) + @tour.start() + @tour.next() + expect($('.popover .popover-navigation a').length).toBe 3 + + it 'should have `data-role` attribute for navigation template', -> + @tour = new Tour + template = $(@tour._options.template) + expect(template.find('*[data-role=next]').size()).toBe 1 + expect(template.find('*[data-role=prev]').size()).toBe 1 + expect(template.find('*[data-role=end]').size()).toBe 1 + + it 'should unbind click events when hiding step (in reflex mode)', -> + $element = $('
').appendTo('body') + @tour = new Tour + @tour.addStep + element: $element + reflex: true + @tour.addStep(element: $('
').appendTo('body')) + + expect($._data($element[0], 'events')).not.toBeDefined() + @tour.start() + expect($._data($element[0], 'events').click.length).toBeGreaterThan 0 + expect($._data($element[0], 'events').click[0].namespace).toBe "tour-#{@tour._options.name}" + + $.each [0..10], => + @tour.next() + expect($._data($element[0], 'events')).not.toBeDefined() + @tour.prev() + expect($._data($element[0], 'events').click.length).toBeGreaterThan 0 + expect($._data($element[0], 'events').click[0].namespace).toBe "tour-#{@tour._options.name}" + + it 'should add `tour-{tourName}` and `tour-{tourName}-{stepId}` classses to the popover', -> + @tour = new Tour + @tour.addStep(element: $('
').appendTo('body')) + @tour.showStep(0) + expect($('.popover').hasClass("tour-#{@tour._options.name}")).toBe true + expect($('.popover').hasClass("tour-#{@tour._options.name}-0")).toBe true + + it 'should add `tour-{tourName}-element` and `tour-{tourName}-{stepId}-element` classses to the popover element', -> + @tour = new Tour + $element = $ '
' + @tour.addStep element: $element.appendTo 'body' + @tour.showStep 0 + expect($element.hasClass "tour-#{@tour._options.name}-element").toBe true + expect($element.hasClass "tour-#{@tour._options.name}-0-element").toBe true + + # orphan + it 'should show orphan steps', -> + @tour = new Tour + @tour.addStep + orphan: true + @tour.showStep(0) + expect($('.popover').length).toBe 1 + $('.popover').remove() + + it 'should add `orphan` class to the popover', -> + @tour = new Tour + @tour.addStep + orphan: true + @tour.showStep(0) + expect($('.popover').hasClass('orphan')).toBe true + $('.popover').remove() + + it 'should use orphan template to show orphan steps', -> + @tour = new Tour + step = orphan: '
' + @tour.addStep step + template = @tour._template(step, 0) + + expect($(template).hasClass('orphan-custom-template')).toBe true + + it 'should not use orphan template to show steps', -> + @tour = new Tour + step = + orphan: '
' + element: $('
').appendTo('body') + @tour.addStep step + template = @tour._template(step, 0) + + expect($(template).hasClass('orphan-custom-template')).toBe false + + it 'should execute orphan template if it is a function', -> + @tour = new Tour + step = orphan: -> '
' + @tour.addStep step + template = @tour._template(step, 0) + + expect($(template).hasClass('orphan-custom-template')).toBe true + + it 'handles quota_exceeded exceptions', -> + @tour = new Tour + @tour.addStep(element: $('
').appendTo('body')) + spyOn(@tour._options.storage, 'setItem').and.callFake -> + throw new Error 'QUOTA_EXCEEDED_ERR', 'QUOTA_EXCEEDED_ERR: DOM Exception 22' + spyOn(@tour, '_setState') + @tour._setState('test', '1') + expect(=> @tour._setState).not.toThrow() + + it 'should not try to scroll to non-existing element', -> + @tour = new Tour + orphan: true + @tour.addStep + element: '#nonExistingElement' + @tour.showStep 0 + expect($('.popover').length).toBe 1 + + # duration + it 'should start the timer', -> + @tour = new Tour + duration: 5000 + @tour.addStep(element: $('
').appendTo('body')) + @tour.start() + expect(@tour._timer).toBeDefined() + expect(@tour._duration).toBeDefined() + window.clearTimeout(@tour._timer) + + it 'should pause the timer on pause', -> + @tour = new Tour + duration: 5000 + @tour.addStep(element: $('
').appendTo('body')) + @tour.start() + window.setTimeout( => + @tour.pause() + expect(@tour._timer).toBe null + expect(@tour._duration).toBeGreaterThan(0).toBeLessThan(5000) + , 1000) + + it 'should stop the timer on hideStep', -> + @tour = new Tour + duration: 5000 + @tour.addStep(element: $('
').appendTo('body')) + @tour.start() + @tour.hideStep(0) + expect(@tour._timer).toBe null + expect(@tour._duration).toBe null + + it 'should stop the timer on end', -> + @tour = new Tour + duration: 5000 + @tour.addStep(element: $('
').appendTo('body')) + @tour.start() + @tour.end() + expect(@tour._timer).toBe null + expect(@tour._duration).toBe null + + it 'should call window.setTimeout when delay is defined', -> + counter = 0 + initialTimeout = window.setTimeout + window.setTimeout = (callback, duration) -> + counter++ + callback() + + @tour = new Tour + delay: { + show: 300 + hide: 400 + } + @tour.addStep(element: $('
').appendTo('body')) + @tour.addStep(element: $('
').appendTo('body')) + @tour.start() + expect(counter).toBe 2 + @tour.next() + expect(counter).toBe 4 + @tour.end() + expect(counter).toBe 5 + + window.setTimeout = initialTimeout + + ### TODO: fix $.support.transition conflict between jquery and bootstrap + it 'should not display inactive popover upon rapid navigation', -> + # Flag that gives signal to the async test that it should evaluate. + $.support.transition = true + $.fx.off = false + isStepShown = false + + # Cleanup all leftover popovers from previous tests. + $('.popover').remove() + + # Setup two-step tour. The problem should occur when switching from first + # step to the second while the transition effect of the first one is still + # active. + @tour = new Tour + @tour.addStep element: $('
').appendTo('body') + @tour.addStep + element: $('
').appendTo('body') + onShown: -> + isStepShown = true + + # Request the first step and immediately the second one. This way the first + # step won't be displayed when the second step is requested, so the request + # for second step can not cleanup existing popovers yet. + runs -> + @tour.goTo(0) + @tour.goTo(1) + waitsFor -> + isStepShown + , 'The second step should be displayed.', 1000 + runs -> expect($('.popover').length).toBe 1 + ### diff --git a/www/bootstrap-tour/src/less/bootstrap-tour-standalone.less b/www/bootstrap-tour/src/less/bootstrap-tour-standalone.less new file mode 100755 index 00000000..53e77ce7 --- /dev/null +++ b/www/bootstrap-tour/src/less/bootstrap-tour-standalone.less @@ -0,0 +1,16 @@ +/*! + * Bootstrap v3.1.0 (http://getbootstrap.com) + * Copyright 2011-2014 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +// Core variables and mixins +@bootstrap-path: "../../bower_components/bootstrap/less/"; + +@import "@{bootstrap-path}variables.less"; +@import "@{bootstrap-path}mixins.less"; +@import "@{bootstrap-path}buttons.less"; +@import "@{bootstrap-path}button-groups.less"; +@import "@{bootstrap-path}popovers.less"; +@import "@{bootstrap-path}component-animations.less"; +@import "bootstrap-tour.less"; diff --git a/www/bootstrap-tour/src/less/bootstrap-tour.less b/www/bootstrap-tour/src/less/bootstrap-tour.less new file mode 100755 index 00000000..875a2d1b --- /dev/null +++ b/www/bootstrap-tour/src/less/bootstrap-tour.less @@ -0,0 +1,39 @@ +.tour-backdrop { + position: absolute; + z-index: 1100; + background-color: #000; + opacity: 0.8; + filter: alpha(opacity=80); +} + +.popover[class*="tour-"] { + z-index: 1102; + + .popover-navigation { + padding: 9px 14px; + overflow: hidden; + + *[data-role="end"] { + float: right; + } + + *[data-role="prev"], + *[data-role="next"], + *[data-role="end"] { + cursor: pointer; + + &.disabled { + cursor: default; + } + } + } + + &.orphan { + position: fixed; + margin-top: 0; + + .arrow { + display: none; + } + } +} diff --git a/www/bootstrap-tour/yarn.lock b/www/bootstrap-tour/yarn.lock new file mode 100755 index 00000000..a9329df3 --- /dev/null +++ b/www/bootstrap-tour/yarn.lock @@ -0,0 +1,3969 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + +accepts@1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" + dependencies: + mime-types "~2.1.11" + negotiator "0.6.1" + +accepts@~1.2.12, accepts@~1.2.13: + version "1.2.13" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.2.13.tgz#e5f1f3928c6d95fd96558c36ec3d9d0de4a6ecea" + dependencies: + mime-types "~2.1.6" + negotiator "0.5.3" + +accepts@~1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" + dependencies: + mime-types "~2.1.16" + negotiator "0.6.1" + +accord@^0.27.3: + version "0.27.3" + resolved "https://registry.yarnpkg.com/accord/-/accord-0.27.3.tgz#7fb9129709285caea84eb372c4e882031b7138e8" + dependencies: + convert-source-map "^1.5.0" + glob "^7.0.5" + indx "^0.2.3" + lodash.clone "^4.3.2" + lodash.defaults "^4.0.1" + lodash.flatten "^4.2.0" + lodash.merge "^4.4.0" + lodash.partialright "^4.1.4" + lodash.pick "^4.2.1" + lodash.uniq "^4.3.0" + resolve "^1.3.3" + semver "^5.3.0" + uglify-js "^2.8.22" + when "^3.7.8" + +after@0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" + +ajv@^4.9.1: + version "4.11.8" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + +ajv@^5.1.0: + version "5.2.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.3.tgz#c06f598778c44c6b161abafe3466b81ad1814ed2" + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + json-schema-traverse "^0.3.0" + json-stable-stringify "^1.0.1" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +ansi-cyan@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" + dependencies: + ansi-wrap "0.1.0" + +ansi-red@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" + dependencies: + ansi-wrap "0.1.0" + +ansi-regex@^0.2.0, ansi-regex@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-styles@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansi-wrap@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" + +anymatch@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + dependencies: + micromatch "^2.1.5" + normalize-path "^2.0.0" + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + +are-we-there-yet@~1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +args-js@^0.10.5: + version "0.10.12" + resolved "https://registry.yarnpkg.com/args-js/-/args-js-0.10.12.tgz#a327aea80e41072a3d85f9c274db6511eb95e49c" + +arr-diff@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" + dependencies: + arr-flatten "^1.0.1" + array-slice "^0.2.3" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + +arr-union@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" + +array-differ@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" + +array-each@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + +array-slice@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" + +array-slice@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.0.0.tgz#e73034f00dcc1f40876008fd20feae77bd4b7c2f" + +array-uniq@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +arraybuffer.slice@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +async@^2.0.1: + version "2.5.0" + resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d" + dependencies: + lodash "^4.14.0" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + +aws4@^1.2.1, aws4@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + +backo2@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +base64-arraybuffer@0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" + +base64-url@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/base64-url/-/base64-url-1.2.1.tgz#199fd661702a0e7b7dcae6e0698bb089c52f6d78" + +base64id@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" + +basic-auth-connect@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/basic-auth-connect/-/basic-auth-connect-1.0.0.tgz#fdb0b43962ca7b40456a7c2bb48fe173da2d2122" + +basic-auth@~1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-1.0.4.tgz#030935b01de7c9b94a824b29f3fccb750d3a5290" + +batch@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.5.3.tgz#3f3414f380321743bfc1042f9a83ff1d5824d464" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +beeper@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" + +better-assert@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" + dependencies: + callsite "1.0.0" + +binary-extensions@^1.0.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.10.0.tgz#9aeb9a6c5e88638aad171e167f5900abe24835d0" + +bl@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.0.3.tgz#fc5421a28fd4226036c3b3891a66a25bc64d226e" + dependencies: + readable-stream "~2.0.5" + +blob@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +bluebird@^3.3.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" + +body-parser@^1.16.1: + version "1.18.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.1" + http-errors "~1.6.2" + iconv-lite "0.4.19" + on-finished "~2.3.0" + qs "6.5.1" + raw-body "2.3.2" + type-is "~1.6.15" + +body-parser@~1.13.3: + version "1.13.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.13.3.tgz#c08cf330c3358e151016a05746f13f029c97fa97" + dependencies: + bytes "2.1.0" + content-type "~1.0.1" + debug "~2.2.0" + depd "~1.0.1" + http-errors "~1.3.1" + iconv-lite "0.4.11" + on-finished "~2.3.0" + qs "4.0.0" + raw-body "~2.1.2" + type-is "~1.6.6" + +body-parser@~1.14.0: + version "1.14.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.14.2.tgz#1015cb1fe2c443858259581db53332f8d0cf50f9" + dependencies: + bytes "2.2.0" + content-type "~1.0.1" + debug "~2.2.0" + depd "~1.1.0" + http-errors "~1.3.1" + iconv-lite "0.4.13" + on-finished "~2.3.0" + qs "5.2.0" + raw-body "~2.1.5" + type-is "~1.6.10" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +boom@4.x.x: + version "4.3.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" + dependencies: + hoek "4.x.x" + +boom@5.x.x: + version "5.2.0" + resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" + dependencies: + hoek "4.x.x" + +bootstrap@~3: + version "3.3.7" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-3.3.7.tgz#5a389394549f23330875a3b150656574f8a9eb71" + +brace-expansion@^1.0.0, brace-expansion@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^0.1.2: + version "0.1.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6" + dependencies: + expand-range "^0.1.0" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +bump-regex@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/bump-regex/-/bump-regex-2.7.0.tgz#4a21e2537113476c026be588b8a7dddef1934641" + dependencies: + semver "^5.1.0" + xtend "^4.0.1" + +bytes@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.1.0.tgz#ac93c410e2ffc9cc7cf4b464b38289067f5e47b4" + +bytes@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.2.0.tgz#fd35464a403f6f9117c2de3609ecff9cae000588" + +bytes@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + +callsite@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + +caseless@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" + dependencies: + ansi-styles "^1.1.0" + escape-string-regexp "^1.0.0" + has-ansi "^0.1.0" + strip-ansi "^0.3.0" + supports-color "^0.2.0" + +chalk@^1.0.0, chalk@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chokidar@^1.4.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +clone-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" + +clone-stats@^0.0.1, clone-stats@~0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" + +clone-stats@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" + +clone@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" + +clone@^1.0.0, clone@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" + +clone@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" + +cloneable-readable@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.0.0.tgz#a6290d413f217a61232f95e458ff38418cfb0117" + dependencies: + inherits "^2.0.1" + process-nextick-args "^1.0.6" + through2 "^2.0.1" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +coffee-script@^1.10.0, coffee-script@~1.12.7: + version "1.12.7" + resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.12.7.tgz#c05dae0cb79591d05b3070a8433a98c9a89ccc53" + +coffee-script@~1.11.0: + version "1.11.1" + resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.11.1.tgz#bf1c47ad64443a0d95d12df2b147cc0a4daad6e9" + +coffeelint-stylish@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/coffeelint-stylish/-/coffeelint-stylish-0.1.2.tgz#ab501a64435e231706da13a27527ab695700abc9" + dependencies: + chalk "^1.0.0" + text-table "^0.2.0" + +coffeelint@^1.4.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/coffeelint/-/coffeelint-1.16.0.tgz#83d8ed1dafde3a677de44e7b8a18be607761e6d8" + dependencies: + coffee-script "~1.11.0" + glob "^7.0.6" + ignore "^3.0.9" + optimist "^0.6.1" + resolve "^0.6.3" + strip-json-comments "^1.0.2" + +colors@^1.1.0, colors@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + +combine-lists@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/combine-lists/-/combine-lists-1.0.1.tgz#458c07e09e0d900fc28b70a3fec2dacd1d2cb7f6" + dependencies: + lodash "^4.5.0" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +commander@^2.9.0, commander@~2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" + +component-bind@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + +component-emitter@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" + +component-emitter@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + +component-inherit@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + +compressible@~2.0.5: + version "2.0.11" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.11.tgz#16718a75de283ed8e604041625a2064586797d8a" + dependencies: + mime-db ">= 1.29.0 < 2" + +compression@~1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.5.2.tgz#b03b8d86e6f8ad29683cba8df91ddc6ffc77b395" + dependencies: + accepts "~1.2.12" + bytes "2.1.0" + compressible "~2.0.5" + debug "~2.2.0" + on-headers "~1.0.0" + vary "~1.0.1" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.0.tgz#53f7d43c51c5e43f81c8fdd03321c631be68d611" + dependencies: + inherits "~2.0.1" + readable-stream "~2.0.0" + typedarray "~0.0.5" + +concat-with-sourcemaps@*, concat-with-sourcemaps@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.0.4.tgz#f55b3be2aeb47601b10a2d5259ccfb70fd2f1dd6" + dependencies: + source-map "^0.5.1" + +connect-livereload@^0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/connect-livereload/-/connect-livereload-0.5.4.tgz#80157d1371c9f37cc14039ab1895970d119dc3bc" + +connect-timeout@~1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/connect-timeout/-/connect-timeout-1.6.2.tgz#de9a5ec61e33a12b6edaab7b5f062e98c599b88e" + dependencies: + debug "~2.2.0" + http-errors "~1.3.1" + ms "0.7.1" + on-headers "~1.0.0" + +connect@^2.30.0: + version "2.30.2" + resolved "https://registry.yarnpkg.com/connect/-/connect-2.30.2.tgz#8da9bcbe8a054d3d318d74dfec903b5c39a1b609" + dependencies: + basic-auth-connect "1.0.0" + body-parser "~1.13.3" + bytes "2.1.0" + compression "~1.5.2" + connect-timeout "~1.6.2" + content-type "~1.0.1" + cookie "0.1.3" + cookie-parser "~1.3.5" + cookie-signature "1.0.6" + csurf "~1.8.3" + debug "~2.2.0" + depd "~1.0.1" + errorhandler "~1.4.2" + express-session "~1.11.3" + finalhandler "0.4.0" + fresh "0.3.0" + http-errors "~1.3.1" + method-override "~2.3.5" + morgan "~1.6.1" + multiparty "3.3.2" + on-headers "~1.0.0" + parseurl "~1.3.0" + pause "0.1.0" + qs "4.0.0" + response-time "~2.3.1" + serve-favicon "~2.3.0" + serve-index "~1.7.2" + serve-static "~1.10.0" + type-is "~1.6.6" + utils-merge "1.0.0" + vhost "~3.0.1" + +connect@^3.6.0: + version "3.6.5" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.5.tgz#fb8dde7ba0763877d0ec9df9dac0b4b40e72c7da" + dependencies: + debug "2.6.9" + finalhandler "1.0.6" + parseurl "~1.3.2" + utils-merge "1.0.1" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +content-type@~1.0.1, content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + +convert-source-map@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" + +cookie-parser@~1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.3.5.tgz#9d755570fb5d17890771227a02314d9be7cf8356" + dependencies: + cookie "0.1.3" + cookie-signature "1.0.6" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + +cookie@0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.1.3.tgz#e734a5c1417fce472d5aef82c381cabb64d1a435" + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + +core-js@^2.2.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +crc@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/crc/-/crc-3.3.0.tgz#fa622e1bc388bf257309082d6b65200ce67090ba" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +cryptiles@3.x.x: + version "3.1.2" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" + dependencies: + boom "5.x.x" + +csrf@~3.0.0: + version "3.0.6" + resolved "https://registry.yarnpkg.com/csrf/-/csrf-3.0.6.tgz#b61120ddceeafc91e76ed5313bb5c0b2667b710a" + dependencies: + rndm "1.2.0" + tsscmp "1.0.5" + uid-safe "2.1.4" + +csurf@~1.8.3: + version "1.8.3" + resolved "https://registry.yarnpkg.com/csurf/-/csurf-1.8.3.tgz#23f2a13bf1d8fce1d0c996588394442cba86a56a" + dependencies: + cookie "0.1.3" + cookie-signature "1.0.6" + csrf "~3.0.0" + http-errors "~1.3.1" + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + dependencies: + array-find-index "^1.0.1" + +custom-event@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +dateformat@^1.0.11, dateformat@^1.0.7-1.2.3: + version "1.0.12" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" + dependencies: + get-stdin "^4.0.1" + meow "^3.3.0" + +dateformat@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" + +debug@0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" + +debug@2.2.0, debug@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + +debug@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" + dependencies: + ms "0.7.2" + +debug@2.6.9, debug@^2.2.0: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + +decamelize@^1.0.0, decamelize@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +deep-extend@~0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" + +defaults@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + dependencies: + clone "^1.0.2" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +depd@1.1.1, depd@~1.1.0, depd@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" + +depd@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.0.1.tgz#80aec64c9d6d97e65cc2a9caa93c0aa6abf73aaa" + +deprecated@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + +detect-file@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" + dependencies: + fs-exists-sync "^0.1.0" + +di@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" + +dom-serialize@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" + dependencies: + custom-event "~1.0.0" + ent "~2.2.0" + extend "^3.0.0" + void-elements "^2.0.0" + +duplexer2@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" + dependencies: + readable-stream "~1.1.9" + +duplexer@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +encodeurl@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" + +end-of-stream@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" + dependencies: + once "~1.3.0" + +engine.io-client@1.8.3: + version "1.8.3" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.3.tgz#1798ed93451246453d4c6f635d7a201fe940d5ab" + dependencies: + component-emitter "1.2.1" + component-inherit "0.0.3" + debug "2.3.3" + engine.io-parser "1.3.2" + has-cors "1.1.0" + indexof "0.0.1" + parsejson "0.0.3" + parseqs "0.0.5" + parseuri "0.0.5" + ws "1.1.2" + xmlhttprequest-ssl "1.5.3" + yeast "0.1.2" + +engine.io-parser@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.2.tgz#937b079f0007d0893ec56d46cb220b8cb435220a" + dependencies: + after "0.8.2" + arraybuffer.slice "0.0.6" + base64-arraybuffer "0.1.5" + blob "0.0.4" + has-binary "0.1.7" + wtf-8 "1.0.0" + +engine.io@1.8.3: + version "1.8.3" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.3.tgz#8de7f97895d20d39b85f88eeee777b2bd42b13d4" + dependencies: + accepts "1.3.3" + base64id "1.0.0" + cookie "0.3.1" + debug "2.3.3" + engine.io-parser "1.3.2" + ws "1.1.2" + +ent@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" + +errno@^0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" + dependencies: + prr "~0.0.0" + +error-ex@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + dependencies: + is-arrayish "^0.2.1" + +errorhandler@~1.4.2: + version "1.4.3" + resolved "https://registry.yarnpkg.com/errorhandler/-/errorhandler-1.4.3.tgz#b7b70ed8f359e9db88092f2d20c0f831420ad83f" + dependencies: + accepts "~1.3.0" + escape-html "~1.0.3" + +escape-html@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.2.tgz#d77d32fa98e38c2f41ae85e9278e0e0e6ba1022c" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + +escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +etag@~1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.7.0.tgz#03d30b5f67dd6e632d2945d30d6652731a34d5d8" + +event-stream@^3.3.2: + version "3.3.4" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.3" + stream-combiner "~0.0.4" + through "~2.3.1" + +eventemitter3@1.x.x: + version "1.2.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + +expand-braces@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea" + dependencies: + array-slice "^0.2.3" + array-unique "^0.2.1" + braces "^0.1.2" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044" + dependencies: + is-number "^0.1.1" + repeat-string "^0.2.2" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +expand-tilde@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" + dependencies: + os-homedir "^1.0.1" + +expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + dependencies: + homedir-polyfill "^1.0.1" + +express-session@~1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/express-session/-/express-session-1.11.3.tgz#5cc98f3f5ff84ed835f91cbf0aabd0c7107400af" + dependencies: + cookie "0.1.3" + cookie-signature "1.0.6" + crc "3.3.0" + debug "~2.2.0" + depd "~1.0.1" + on-headers "~1.0.0" + parseurl "~1.3.0" + uid-safe "~2.0.0" + utils-merge "1.0.0" + +extend-shallow@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" + dependencies: + kind-of "^1.1.0" + +extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extract-zip@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.5.0.tgz#92ccf6d81ef70a9fa4c1747114ccef6d8688a6c4" + dependencies: + concat-stream "1.5.0" + debug "0.7.4" + mkdirp "0.5.0" + yauzl "2.4.1" + +extsprintf@1.3.0, extsprintf@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +fancy-log@^1.1.0, fancy-log@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.0.tgz#45be17d02bb9917d60ccffd4995c999e6c8c9948" + dependencies: + chalk "^1.1.1" + time-stamp "^1.0.0" + +fast-deep-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" + +faye-websocket@~0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + dependencies: + websocket-driver ">=0.5.1" + +fd-slicer@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" + dependencies: + pend "~1.2.0" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +finalhandler@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.4.0.tgz#965a52d9e8d05d2b857548541fb89b53a2497d9b" + dependencies: + debug "~2.2.0" + escape-html "1.0.2" + on-finished "~2.3.0" + unpipe "~1.0.0" + +finalhandler@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.6.tgz#007aea33d1a4d3e42017f624848ad58d212f814f" + dependencies: + debug "2.6.9" + encodeurl "~1.0.1" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.3.1" + unpipe "~1.0.0" + +find-index@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +findup-sync@^0.4.0, findup-sync@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" + dependencies: + detect-file "^0.1.0" + is-glob "^2.0.1" + micromatch "^2.3.7" + resolve-dir "^0.1.0" + +fined@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fined/-/fined-1.1.0.tgz#b37dc844b76a2f5e7081e884f7c0ae344f153476" + dependencies: + expand-tilde "^2.0.2" + is-plain-object "^2.0.3" + object.defaults "^1.1.0" + object.pick "^1.2.0" + parse-filepath "^1.0.1" + +first-chunk-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" + +flagged-respawn@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-0.3.2.tgz#ff191eddcd7088a675b2610fffc976be9b8074b5" + +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +for-own@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + dependencies: + for-in "^1.0.1" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~1.0.0-rc3: + version "1.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-1.0.1.tgz#ae315db9a4907fa065502304a66d7733475ee37c" + dependencies: + async "^2.0.1" + combined-stream "^1.0.5" + mime-types "^2.1.11" + +form-data@~2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +form-data@~2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +fresh@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f" + +from@~0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" + +fs-access@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fs-access/-/fs-access-1.0.1.tgz#d6a87f262271cefebec30c553407fb995da8777a" + dependencies: + null-check "^1.0.0" + +fs-exists-sync@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" + +fs-extra@~0.26.4: + version "0.26.7" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.2.tgz#3282b713fb3ad80ede0e9fcf4611b5aa6fc033f4" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.36" + +fstream-ignore@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + 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" + +gaze@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f" + dependencies: + globule "~0.1.0" + +generate-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" + +generate-object-property@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" + dependencies: + is-property "^1.0.0" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob-stream@^3.1.5: + version "3.1.18" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" + dependencies: + glob "^4.3.1" + glob2base "^0.0.12" + minimatch "^2.0.1" + ordered-read-streams "^0.1.0" + through2 "^0.6.1" + unique-stream "^1.0.0" + +glob-watcher@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b" + dependencies: + gaze "^0.5.1" + +glob2base@^0.0.12: + version "0.0.12" + resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" + dependencies: + find-index "^0.1.1" + +glob@^4.3.1: + version "4.5.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "^2.0.1" + once "^1.3.0" + +glob@^7.0.5, glob@^7.0.6, glob@^7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + 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@~3.1.21: + version "3.1.21" + resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" + dependencies: + graceful-fs "~1.2.0" + inherits "1" + minimatch "~0.2.11" + +global-modules@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" + dependencies: + global-prefix "^0.1.4" + is-windows "^0.2.0" + +global-prefix@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" + dependencies: + homedir-polyfill "^1.0.0" + ini "^1.3.4" + is-windows "^0.2.0" + which "^1.2.12" + +globule@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5" + dependencies: + glob "~3.1.21" + lodash "~1.0.1" + minimatch "~0.2.11" + +glogg@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5" + dependencies: + sparkles "^1.0.0" + +graceful-fs@^3.0.0: + version "3.0.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" + dependencies: + natives "^1.1.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +graceful-fs@~1.2.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" + +gulp-bump@~2.7: + version "2.7.0" + resolved "https://registry.yarnpkg.com/gulp-bump/-/gulp-bump-2.7.0.tgz#4c3750bce93c5d816fe9a154e6619dd509a852d8" + dependencies: + bump-regex "^2.7.0" + plugin-error "^0.1.2" + plugin-log "^0.1.0" + semver "^5.3.0" + through2 "^2.0.1" + +gulp-changed@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/gulp-changed/-/gulp-changed-3.1.0.tgz#87cd1593a0bb4a5129dc2f229bece6d9488c272a" + dependencies: + gulp-util "^3.0.0" + pify "^2.3.0" + through2 "^2.0.0" + +gulp-clean@~0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/gulp-clean/-/gulp-clean-0.3.2.tgz#a347d473acea40182f935587a451941671928102" + dependencies: + gulp-util "^2.2.14" + rimraf "^2.2.8" + through2 "^0.4.2" + +gulp-coffee@~2.3.4: + version "2.3.4" + resolved "https://registry.yarnpkg.com/gulp-coffee/-/gulp-coffee-2.3.4.tgz#e9975faf3f26746fb2e72da9e3f32c9db5746daa" + dependencies: + coffee-script "^1.10.0" + gulp-util "^3.0.2" + merge "^1.2.0" + through2 "^2.0.1" + vinyl-sourcemaps-apply "^0.2.1" + +gulp-coffeelint@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/gulp-coffeelint/-/gulp-coffeelint-0.6.0.tgz#b4706849c5e3b057658bf638ccfa5dee7351023b" + dependencies: + args-js "^0.10.5" + coffeelint "^1.4.0" + coffeelint-stylish "^0.1.1" + gulp-util "^3.0.0" + through2 "^2.0.0" + +gulp-concat@~2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/gulp-concat/-/gulp-concat-2.6.1.tgz#633d16c95d88504628ad02665663cee5a4793353" + dependencies: + concat-with-sourcemaps "^1.0.0" + through2 "^2.0.0" + vinyl "^2.0.0" + +gulp-connect@~5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/gulp-connect/-/gulp-connect-5.0.0.tgz#f2fdf306ae911468368c2285f2d782f13eddaf4e" + dependencies: + connect "^2.30.0" + connect-livereload "^0.5.4" + event-stream "^3.3.2" + gulp-util "^3.0.6" + tiny-lr "^0.2.1" + +gulp-header@~1.8.9: + version "1.8.9" + resolved "https://registry.yarnpkg.com/gulp-header/-/gulp-header-1.8.9.tgz#c9f10fee0632d81e939789c6ecf45a151bf3098b" + dependencies: + concat-with-sourcemaps "*" + gulp-util "*" + object-assign "*" + through2 "^2.0.0" + +gulp-jasmine@~2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/gulp-jasmine/-/gulp-jasmine-2.4.2.tgz#5a7f47e27370c3619ac0a2a442be399671409db3" + dependencies: + arrify "^1.0.0" + gulp-util "^3.0.0" + jasmine "^2.3.0" + jasmine-terminal-reporter "^1.0.0" + through2 "^2.0.0" + +gulp-less@~3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/gulp-less/-/gulp-less-3.3.2.tgz#f6636adcc66150a8902719fa59963fc7f862a49a" + dependencies: + accord "^0.27.3" + gulp-util "^3.0.7" + less "2.6.x || ^2.7.1" + object-assign "^4.0.1" + through2 "^2.0.0" + vinyl-sourcemaps-apply "^0.2.0" + +gulp-load-plugins@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/gulp-load-plugins/-/gulp-load-plugins-1.5.0.tgz#4c419f7e5764d9a0e33061bab9618f81b73d4171" + dependencies: + array-unique "^0.2.1" + fancy-log "^1.2.0" + findup-sync "^0.4.0" + gulplog "^1.0.0" + has-gulplog "^0.1.0" + micromatch "^2.3.8" + resolve "^1.1.7" + +gulp-open@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/gulp-open/-/gulp-open-2.0.0.tgz#a16f67e95cea8b2061b63a3b8c389bc559b8e1ce" + dependencies: + colors "^1.1.2" + gulp-util "^3.0.2" + open "0.0.5" + through2 "^2.0.1" + +gulp-rename@~1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.2.2.tgz#3ad4428763f05e2764dec1c67d868db275687817" + +gulp-uglify@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/gulp-uglify/-/gulp-uglify-3.0.0.tgz#0df0331d72a0d302e3e37e109485dddf33c6d1ca" + dependencies: + gulplog "^1.0.0" + has-gulplog "^0.1.0" + lodash "^4.13.1" + make-error-cause "^1.1.1" + through2 "^2.0.0" + uglify-js "^3.0.5" + vinyl-sourcemaps-apply "^0.2.0" + +gulp-util@*, gulp-util@^3.0.0, gulp-util@^3.0.2, gulp-util@^3.0.6, gulp-util@^3.0.7, gulp-util@~3.0.0: + version "3.0.8" + resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" + dependencies: + array-differ "^1.0.0" + array-uniq "^1.0.2" + beeper "^1.0.0" + chalk "^1.0.0" + dateformat "^2.0.0" + fancy-log "^1.1.0" + gulplog "^1.0.0" + has-gulplog "^0.1.0" + lodash._reescape "^3.0.0" + lodash._reevaluate "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.template "^3.0.0" + minimist "^1.1.0" + multipipe "^0.1.2" + object-assign "^3.0.0" + replace-ext "0.0.1" + through2 "^2.0.0" + vinyl "^0.5.0" + +gulp-util@^2.2.14: + version "2.2.20" + resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-2.2.20.tgz#d7146e5728910bd8f047a6b0b1e549bc22dbd64c" + dependencies: + chalk "^0.5.0" + dateformat "^1.0.7-1.2.3" + lodash._reinterpolate "^2.4.1" + lodash.template "^2.4.1" + minimist "^0.2.0" + multipipe "^0.1.0" + through2 "^0.5.0" + vinyl "^0.2.1" + +gulp@~3.9.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4" + dependencies: + archy "^1.0.0" + chalk "^1.0.0" + deprecated "^0.0.1" + gulp-util "^3.0.0" + interpret "^1.0.0" + liftoff "^2.1.0" + minimist "^1.1.0" + orchestrator "^0.3.0" + pretty-hrtime "^1.0.0" + semver "^4.1.0" + tildify "^1.0.0" + v8flags "^2.0.2" + vinyl-fs "^0.3.0" + +gulplog@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" + dependencies: + glogg "^1.0.0" + +har-schema@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + +har-validator@~2.0.2: + version "2.0.6" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" + dependencies: + chalk "^1.1.1" + commander "^2.9.0" + is-my-json-valid "^2.12.4" + pinkie-promise "^2.0.0" + +har-validator@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + +har-validator@~5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + dependencies: + ajv "^5.1.0" + har-schema "^2.0.0" + +has-ansi@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" + dependencies: + ansi-regex "^0.2.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-binary@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c" + dependencies: + isarray "0.0.1" + +has-cors@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + +has-gulplog@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" + dependencies: + sparkles "^1.0.0" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +hasha@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-2.2.0.tgz#78d7cbfc1e6d66303fe79837365984517b2f6ee1" + dependencies: + is-stream "^1.0.1" + pinkie-promise "^2.0.0" + +hawk@3.1.3, hawk@~3.1.0, hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hawk@~6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" + dependencies: + boom "4.x.x" + cryptiles "3.x.x" + hoek "4.x.x" + sntp "2.x.x" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +hoek@4.x.x: + version "4.2.0" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" + +homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" + dependencies: + parse-passwd "^1.0.0" + +hosted-git-info@^2.1.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" + +http-errors@1.6.2, http-errors@~1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" + dependencies: + depd "1.1.1" + inherits "2.0.3" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" + +http-errors@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.3.1.tgz#197e22cdebd4198585e8694ef6786197b91ed942" + dependencies: + inherits "~2.0.1" + statuses "1" + +http-parser-js@>=0.4.0: + version "0.4.8" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.8.tgz#763f75c4b771a0bb44653b07070bff6ca7bc5561" + +http-proxy@^1.13.0: + version "1.16.2" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" + dependencies: + eventemitter3 "1.x.x" + requires-port "1.x.x" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +iconv-lite@0.4.11: + version "0.4.11" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.11.tgz#2ecb42fd294744922209a2e7c404dac8793d8ade" + +iconv-lite@0.4.13: + version "0.4.13" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" + +iconv-lite@0.4.19: + version "0.4.19" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" + +ignore@^3.0.9: + version "3.3.5" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.5.tgz#c4e715455f6073a8d7e5dae72d2fc9d71663dba6" + +image-size@~0.5.0: + version "0.5.5" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + dependencies: + repeating "^2.0.0" + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + +indx@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/indx/-/indx-0.2.3.tgz#15dcf56ee9cf65c0234c513c27fbd580e70fbc50" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" + +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +ini@^1.3.4, ini@~1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +interpret@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.4.tgz#820cdd588b868ffb191a809506d6c9c8f212b1b0" + +is-absolute@^0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.2.6.tgz#20de69f3db942ef2d87b9c2da36f172235b1b5eb" + dependencies: + is-relative "^0.2.1" + is-windows "^0.2.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-my-json-valid@^2.12.4: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz#5a846777e2c2620d1e69104e5d3a03b1f6088f11" + dependencies: + generate-function "^2.0.0" + generate-object-property "^1.1.0" + jsonpointer "^4.0.0" + xtend "^4.0.0" + +is-number@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806" + +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + +is-plain-object@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + dependencies: + isobject "^3.0.1" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-property@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + +is-relative@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.2.1.tgz#d27f4c7d516d175fb610db84bbeef23c3bc97aa5" + dependencies: + is-unc-path "^0.1.1" + +is-stream@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-unc-path@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-0.1.2.tgz#6ab053a72573c10250ff416a3814c35178af39b9" + dependencies: + unc-path-regex "^0.1.0" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +is-windows@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isbinaryfile@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + +isstream@^0.1.2, isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +jasmine-core@~2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.8.0.tgz#bcc979ae1f9fd05701e45e52e65d3a5d63f1a24e" + +jasmine-terminal-reporter@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/jasmine-terminal-reporter/-/jasmine-terminal-reporter-1.0.3.tgz#896f1ec8fdf4bf6aecdd41c503eda7347f61526b" + dependencies: + indent-string "^2.1.0" + pluralize "^1.2.1" + +jasmine@^2.3.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-2.8.0.tgz#6b089c0a11576b1f16df11b80146d91d4e8b8a3e" + dependencies: + exit "^0.1.2" + glob "^7.0.6" + jasmine-core "~2.8.0" + +jquery@>=1.8: + version "3.2.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.2.1.tgz#5c4d9de652af6cd0a770154a631bba12b015c787" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json3@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsonpointer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +karma-chrome-launcher@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz#cf1b9d07136cc18fe239327d24654c3dbc368acf" + dependencies: + fs-access "^1.0.0" + which "^1.2.1" + +karma-firefox-launcher@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/karma-firefox-launcher/-/karma-firefox-launcher-1.0.1.tgz#ce58f47c2013a88156d55a5d61337c099cf5bb51" + +karma-jasmine@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-1.1.0.tgz#22e4c06bf9a182e5294d1f705e3733811b810acf" + +karma@~1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/karma/-/karma-1.7.1.tgz#85cc08e9e0a22d7ce9cca37c4a1be824f6a2b1ae" + dependencies: + bluebird "^3.3.0" + body-parser "^1.16.1" + chokidar "^1.4.1" + colors "^1.1.0" + combine-lists "^1.0.0" + connect "^3.6.0" + core-js "^2.2.0" + di "^0.0.1" + dom-serialize "^2.2.0" + expand-braces "^0.1.1" + glob "^7.1.1" + graceful-fs "^4.1.2" + http-proxy "^1.13.0" + isbinaryfile "^3.0.0" + lodash "^3.8.0" + log4js "^0.6.31" + mime "^1.3.4" + minimatch "^3.0.2" + optimist "^0.6.1" + qjobs "^1.1.4" + range-parser "^1.2.0" + rimraf "^2.6.0" + safe-buffer "^5.0.1" + socket.io "1.7.3" + source-map "^0.5.3" + tmp "0.0.31" + useragent "^2.1.12" + +kew@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b" + +kind-of@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + optionalDependencies: + graceful-fs "^4.1.9" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +"less@2.6.x || ^2.7.1": + version "2.7.2" + resolved "https://registry.yarnpkg.com/less/-/less-2.7.2.tgz#368d6cc73e1fb03981183280918743c5dcf9b3df" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + mime "^1.2.11" + mkdirp "^0.5.0" + promise "^7.1.1" + request "^2.72.0" + source-map "^0.5.3" + +liftoff@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.3.0.tgz#a98f2ff67183d8ba7cfaca10548bd7ff0550b385" + dependencies: + extend "^3.0.0" + findup-sync "^0.4.2" + fined "^1.0.1" + flagged-respawn "^0.3.2" + lodash.isplainobject "^4.0.4" + lodash.isstring "^4.0.1" + lodash.mapvalues "^4.4.0" + rechoir "^0.6.2" + resolve "^1.1.7" + +livereload-js@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.2.2.tgz#6c87257e648ab475bc24ea257457edcc1f8d0bc2" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basetostring@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" + +lodash._basevalues@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" + +lodash._escapehtmlchar@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz#df67c3bb6b7e8e1e831ab48bfa0795b92afe899d" + dependencies: + lodash._htmlescapes "~2.4.1" + +lodash._escapestringchar@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz#ecfe22618a2ade50bfeea43937e51df66f0edb72" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._htmlescapes@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz#32d14bf0844b6de6f8b62a051b4f67c228b624cb" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash._isnative@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._isnative/-/lodash._isnative-2.4.1.tgz#3ea6404b784a7be836c7b57580e1cdf79b14832c" + +lodash._objecttypes@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz#7c0b7f69d98a1f76529f890b0cdb1b4dfec11c11" + +lodash._reescape@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" + +lodash._reevaluate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" + +lodash._reinterpolate@^2.4.1, lodash._reinterpolate@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz#4f1227aa5a8711fc632f5b07a1f4607aab8b3222" + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + +lodash._reunescapedhtml@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz#747c4fc40103eb3bb8a0976e571f7a2659e93ba7" + dependencies: + lodash._htmlescapes "~2.4.1" + lodash.keys "~2.4.1" + +lodash._root@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" + +lodash._shimkeys@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz#6e9cc9666ff081f0b5a6c978b83e242e6949d203" + dependencies: + lodash._objecttypes "~2.4.1" + +lodash.clone@^4.3.2: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" + +lodash.defaults@^4.0.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + +lodash.defaults@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-2.4.1.tgz#a7e8885f05e68851144b6e12a8f3678026bc4c54" + dependencies: + lodash._objecttypes "~2.4.1" + lodash.keys "~2.4.1" + +lodash.escape@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" + dependencies: + lodash._root "^3.0.0" + +lodash.escape@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-2.4.1.tgz#2ce12c5e084db0a57dda5e5d1eeeb9f5d175a3b4" + dependencies: + lodash._escapehtmlchar "~2.4.1" + lodash._reunescapedhtml "~2.4.1" + lodash.keys "~2.4.1" + +lodash.flatten@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.isobject@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.4.1.tgz#5a2e47fe69953f1ee631a7eba1fe64d2d06558f5" + dependencies: + lodash._objecttypes "~2.4.1" + +lodash.isplainobject@^4.0.4: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.keys@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-2.4.1.tgz#48dea46df8ff7632b10d706b8acb26591e2b3727" + dependencies: + lodash._isnative "~2.4.1" + lodash._shimkeys "~2.4.1" + lodash.isobject "~2.4.1" + +lodash.mapvalues@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" + +lodash.merge@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5" + +lodash.partialright@^4.1.4: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.partialright/-/lodash.partialright-4.2.1.tgz#0130d80e83363264d40074f329b8a3e7a8a1cc4b" + +lodash.pick@^4.2.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + +lodash.template@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-2.4.1.tgz#9e611007edf629129a974ab3c48b817b3e1cf20d" + dependencies: + lodash._escapestringchar "~2.4.1" + lodash._reinterpolate "~2.4.1" + lodash.defaults "~2.4.1" + lodash.escape "~2.4.1" + lodash.keys "~2.4.1" + lodash.templatesettings "~2.4.1" + lodash.values "~2.4.1" + +lodash.template@^3.0.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" + dependencies: + lodash._basecopy "^3.0.0" + lodash._basetostring "^3.0.0" + lodash._basevalues "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + lodash.keys "^3.0.0" + lodash.restparam "^3.0.0" + lodash.templatesettings "^3.0.0" + +lodash.templatesettings@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + +lodash.templatesettings@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz#ea76c75d11eb86d4dbe89a83893bb861929ac699" + dependencies: + lodash._reinterpolate "~2.4.1" + lodash.escape "~2.4.1" + +lodash.uniq@^4.3.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + +lodash.values@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-2.4.1.tgz#abf514436b3cb705001627978cbcf30b1280eea4" + dependencies: + lodash.keys "~2.4.1" + +lodash@^3.8.0: + version "3.10.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" + +lodash@^4.13.1, lodash@^4.14.0, lodash@^4.5.0: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + +lodash@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" + +log4js@^0.6.31: + version "0.6.38" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-0.6.38.tgz#2c494116695d6fb25480943d3fc872e662a522fd" + dependencies: + readable-stream "~1.0.2" + semver "~4.3.3" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lru-cache@2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" + +lru-cache@2.2.x: + version "2.2.4" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d" + +make-error-cause@^1.1.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/make-error-cause/-/make-error-cause-1.2.2.tgz#df0388fcd0b37816dff0a5fb8108939777dcbc9d" + dependencies: + make-error "^1.2.0" + +make-error@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.0.tgz#52ad3a339ccf10ce62b4040b708fe707244b8b96" + +map-cache@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + +map-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + +meow@^3.3.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +merge@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" + +method-override@~2.3.5: + version "2.3.10" + resolved "https://registry.yarnpkg.com/method-override/-/method-override-2.3.10.tgz#e3daf8d5dee10dd2dce7d4ae88d62bbee77476b4" + dependencies: + debug "2.6.9" + methods "~1.1.2" + parseurl "~1.3.2" + vary "~1.1.2" + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + +micromatch@^2.1.5, micromatch@^2.3.7, micromatch@^2.3.8: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + 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" + +"mime-db@>= 1.29.0 < 2", mime-db@~1.30.0: + version "1.30.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" + +mime-types@^2.1.11, mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, mime-types@~2.1.6, mime-types@~2.1.7, mime-types@~2.1.9: + version "2.1.17" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" + dependencies: + mime-db "~1.30.0" + +mime@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" + +mime@^1.2.11, mime@^1.3.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + +minimatch@^2.0.1: + version "2.0.10" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" + dependencies: + brace-expansion "^1.0.0" + +minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimatch@~0.2.11: + version "0.2.14" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.0.tgz#4dffe525dae2b864c66c2e23c6271d7afdecefce" + +minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + +mkdirp@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" + dependencies: + minimist "0.0.8" + +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +morgan@~1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.6.1.tgz#5fd818398c6819cba28a7cd6664f292fe1c0bbf2" + dependencies: + basic-auth "~1.0.3" + debug "~2.2.0" + depd "~1.0.1" + on-finished "~2.3.0" + on-headers "~1.0.0" + +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + +ms@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +multiparty@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/multiparty/-/multiparty-3.3.2.tgz#35de6804dc19643e5249f3d3e3bdc6c8ce301d3f" + dependencies: + readable-stream "~1.1.9" + stream-counter "~0.2.0" + +multipipe@^0.1.0, multipipe@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" + dependencies: + duplexer2 "0.0.2" + +nan@^2.3.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" + +natives@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.0.tgz#e9ff841418a6b2ec7a495e939984f78f163e6e31" + +negotiator@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.5.3.tgz#269d5c476810ec92edbe7b6c2f28316384f9a7e8" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + +node-pre-gyp@^0.6.36: + version "0.6.38" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.38.tgz#e92a20f83416415bb4086f6d1fb78b3da73d113d" + dependencies: + 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" + +node-uuid@~1.4.7: + version "1.4.8" + resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + dependencies: + 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@^2.0.0, normalize-path@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +null-check@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/null-check/-/null-check-1.0.0.tgz#977dffd7176012b9ec30d2a39db5cf72a0439edd" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +oauth-sign@~0.8.0, oauth-sign@~0.8.1, oauth-sign@~0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@*, object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object-assign@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" + +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + +object-component@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" + +object-keys@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" + +object.defaults@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" + dependencies: + array-each "^1.0.1" + array-slice "^1.0.0" + for-own "^1.0.0" + isobject "^3.0.0" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +object.pick@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + dependencies: + isobject "^3.0.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.0, on-headers@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" + +once@^1.3.0, once@^1.3.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +once@~1.3.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + dependencies: + wrappy "1" + +open@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/open/-/open-0.0.5.tgz#42c3e18ec95466b6bf0dc42f3a2945c3f0cad8fc" + +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +options@>=0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" + +orchestrator@^0.3.0: + version "0.3.8" + resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" + dependencies: + end-of-stream "~0.1.5" + sequencify "~0.0.7" + stream-consume "~0.1.0" + +ordered-read-streams@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126" + +os-homedir@^1.0.0, os-homedir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +parse-filepath@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.1.tgz#159d6155d43904d16c10ef698911da1e91969b73" + dependencies: + is-absolute "^0.2.3" + map-cache "^0.2.0" + path-root "^0.1.1" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + +parsejson@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab" + dependencies: + better-assert "~1.0.0" + +parseqs@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" + dependencies: + better-assert "~1.0.0" + +parseuri@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" + dependencies: + better-assert "~1.0.0" + +parseurl@~1.3.0, parseurl@~1.3.1, parseurl@~1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + dependencies: + path-root-regex "^0.1.0" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +pause-stream@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + dependencies: + through "~2.3" + +pause@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/pause/-/pause-0.1.0.tgz#ebc8a4a8619ff0b8a81ac1513c3434ff469fdb74" + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + +phantomjs@^2.1.7: + version "2.1.7" + resolved "https://registry.yarnpkg.com/phantomjs/-/phantomjs-2.1.7.tgz#c6910f67935c37285b6114329fc2f27d5f3e3134" + dependencies: + extract-zip "~1.5.0" + fs-extra "~0.26.4" + hasha "^2.2.0" + kew "~0.7.0" + progress "~1.1.8" + request "~2.67.0" + request-progress "~2.0.1" + which "~1.2.2" + +pify@^2.0.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +plugin-error@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" + dependencies: + ansi-cyan "^0.1.1" + ansi-red "^0.1.1" + arr-diff "^1.0.1" + arr-union "^2.0.1" + extend-shallow "^1.1.2" + +plugin-log@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/plugin-log/-/plugin-log-0.1.0.tgz#86049cf6ab10833398a931f3689cbaee7b5e1333" + dependencies: + chalk "^1.1.1" + dateformat "^1.0.11" + +pluralize@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +pretty-hrtime@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + +process-nextick-args@^1.0.6, process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +progress@~1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + dependencies: + asap "~2.0.3" + +prr@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +qjobs@^1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.1.5.tgz#659de9f2cf8dcc27a1481276f205377272382e73" + +qs@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-4.0.0.tgz#c31d9b74ec27df75e543a86c78728ed8d4623607" + +qs@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-5.2.0.tgz#a9f31142af468cb72b25b30136ba2456834916be" + +qs@6.5.1, qs@~6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" + +qs@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-5.1.0.tgz#4d932e5c7ea411cca76a312d39a606200fd50cd9" + +qs@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-5.2.1.tgz#801fee030e0b9450d6385adc48a4cc55b44aedfc" + +qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +random-bytes@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b" + +randomatic@^1.1.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +range-parser@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + +range-parser@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.0.3.tgz#6872823535c692e2c2a0103826afd82c2e0ff175" + +raw-body@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" + dependencies: + bytes "3.0.0" + http-errors "1.6.2" + iconv-lite "0.4.19" + unpipe "1.0.0" + +raw-body@~2.1.2, raw-body@~2.1.5: + version "2.1.7" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.1.7.tgz#adfeace2e4fb3098058014d08c072dcc59758774" + dependencies: + bytes "2.4.0" + iconv-lite "0.4.13" + unpipe "1.0.0" + +rc@^1.1.7: + version "1.2.1" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.17, readable-stream@~1.0.2, readable-stream@~1.0.33: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5: + version "2.3.3" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" + util-deprecate "~1.0.1" + +readable-stream@~1.1.8, readable-stream@~1.1.9: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@~2.0.0, readable-stream@~2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + dependencies: + resolve "^1.1.6" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + dependencies: + is-equal-shallow "^0.1.3" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884e8b1fb4ae" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +replace-ext@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" + +replace-ext@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" + +request-progress@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-2.0.1.tgz#5d36bb57961c673aa5b788dbc8141fdf23b44e08" + dependencies: + throttleit "^1.0.0" + +request@2.81.0: + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + 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" + +request@^2.72.0: + version "2.83.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" + dependencies: + 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@~2.67.0: + version "2.67.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.67.0.tgz#8af74780e2bf11ea0ae9aa965c11f11afd272742" + dependencies: + aws-sign2 "~0.6.0" + bl "~1.0.0" + caseless "~0.11.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~1.0.0-rc3" + har-validator "~2.0.2" + hawk "~3.1.0" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + node-uuid "~1.4.7" + oauth-sign "~0.8.0" + qs "~5.2.0" + stringstream "~0.0.4" + tough-cookie "~2.2.0" + tunnel-agent "~0.4.1" + +requires-port@1.x.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + +resolve-dir@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" + dependencies: + expand-tilde "^1.2.2" + global-modules "^0.2.3" + +resolve@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-0.6.3.tgz#dd957982e7e736debdf53b58a4dd91754575dd46" + +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.4.0.tgz#a75be01c53da25d934a98ebd0e4c4a7312f92a86" + dependencies: + path-parse "^1.0.5" + +response-time@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/response-time/-/response-time-2.3.2.tgz#ffa71bab952d62f7c1d49b7434355fbc68dffc5a" + dependencies: + depd "~1.1.0" + on-headers "~1.0.1" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.0, rimraf@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + dependencies: + glob "^7.0.5" + +rndm@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/rndm/-/rndm-1.2.0.tgz#f33fe9cfb52bbfd520aa18323bc65db110a1b76c" + +safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + +"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" + +semver@^4.1.0, semver@~4.3.3: + version "4.3.6" + resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" + +send@0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.13.2.tgz#765e7607c8055452bba6f0b052595350986036de" + dependencies: + debug "~2.2.0" + depd "~1.1.0" + destroy "~1.0.4" + escape-html "~1.0.3" + etag "~1.7.0" + fresh "0.3.0" + http-errors "~1.3.1" + mime "1.3.4" + ms "0.7.1" + on-finished "~2.3.0" + range-parser "~1.0.3" + statuses "~1.2.1" + +sequencify@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" + +serve-favicon@~2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/serve-favicon/-/serve-favicon-2.3.2.tgz#dd419e268de012ab72b319d337f2105013f9381f" + dependencies: + etag "~1.7.0" + fresh "0.3.0" + ms "0.7.2" + parseurl "~1.3.1" + +serve-index@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.7.3.tgz#7a057fc6ee28dc63f64566e5fa57b111a86aecd2" + dependencies: + accepts "~1.2.13" + batch "0.5.3" + debug "~2.2.0" + escape-html "~1.0.3" + http-errors "~1.3.1" + mime-types "~2.1.9" + parseurl "~1.3.1" + +serve-static@~1.10.0: + version "1.10.3" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.10.3.tgz#ce5a6ecd3101fed5ec09827dac22a9c29bfb0535" + dependencies: + escape-html "~1.0.3" + parseurl "~1.3.1" + send "0.13.2" + +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +setprototypeof@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + +sigmund@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + +signal-exit@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +sntp@2.x.x: + version "2.0.2" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.0.2.tgz#5064110f0af85f7cfdb7d6b67a40028ce52b4b2b" + dependencies: + hoek "4.x.x" + +socket.io-adapter@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b" + dependencies: + debug "2.3.3" + socket.io-parser "2.3.1" + +socket.io-client@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.7.3.tgz#b30e86aa10d5ef3546601c09cde4765e381da377" + dependencies: + backo2 "1.0.2" + component-bind "1.0.0" + component-emitter "1.2.1" + debug "2.3.3" + engine.io-client "1.8.3" + has-binary "0.1.7" + indexof "0.0.1" + object-component "0.0.3" + parseuri "0.0.5" + socket.io-parser "2.3.1" + to-array "0.1.4" + +socket.io-parser@2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0" + dependencies: + component-emitter "1.1.2" + debug "2.2.0" + isarray "0.0.1" + json3 "3.3.2" + +socket.io@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.7.3.tgz#b8af9caba00949e568e369f1327ea9be9ea2461b" + dependencies: + debug "2.3.3" + engine.io "1.8.3" + has-binary "0.1.7" + object-assign "4.1.0" + socket.io-adapter "0.5.0" + socket.io-client "1.7.3" + socket.io-parser "2.3.1" + +source-map@^0.5.1, source-map@^0.5.3, source-map@~0.5.1: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + +sparkles@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" + +spdx-correct@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + dependencies: + spdx-license-ids "^1.0.2" + +spdx-expression-parse@~1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + +spdx-license-ids@^1.0.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + +split@0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + dependencies: + through "2" + +sshpk@^1.7.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +statuses@1, "statuses@>= 1.3.1 < 2", statuses@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + +statuses@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.2.1.tgz#dded45cc18256d51ed40aec142489d5c61026d28" + +stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + dependencies: + duplexer "~0.1.1" + +stream-consume@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.0.tgz#a41ead1a6d6081ceb79f65b061901b6d8f3d1d0f" + +stream-counter@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/stream-counter/-/stream-counter-0.2.0.tgz#ded266556319c8b0e222812b9cf3b26fa7d947de" + dependencies: + readable-stream "~1.1.8" + +streamqueue@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/streamqueue/-/streamqueue-1.1.1.tgz#d3ad76686be924bbf9ca2c74a814a2182475d6d7" + dependencies: + isstream "^0.1.2" + readable-stream "~1.0.33" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +string_decoder@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + dependencies: + safe-buffer "~5.1.0" + +stringstream@~0.0.4, stringstream@~0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" + dependencies: + ansi-regex "^0.2.1" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-bom@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" + dependencies: + first-chunk-stream "^1.0.0" + is-utf8 "^0.2.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + dependencies: + get-stdin "^4.0.1" + +strip-json-comments@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +supports-color@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +tar-pack@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" + dependencies: + debug "^2.2.0" + fstream "^1.0.10" + fstream-ignore "^1.0.5" + once "^1.3.3" + readable-stream "^2.1.4" + rimraf "^2.5.1" + tar "^2.2.1" + uid-number "^0.0.6" + +tar@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + +throttleit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" + +through2@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b" + dependencies: + readable-stream "~1.0.17" + xtend "~2.1.1" + +through2@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.5.1.tgz#dfdd012eb9c700e2323fd334f38ac622ab372da7" + dependencies: + readable-stream "~1.0.17" + xtend "~3.0.0" + +through2@^0.6.1: + version "0.6.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + +through2@^2.0.0, through2@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" + +through@2, through@~2.3, through@~2.3.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +tildify@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" + dependencies: + os-homedir "^1.0.0" + +time-stamp@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" + +tiny-lr@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-0.2.1.tgz#b3fdba802e5d56a33c2f6f10794b32e477ac729d" + dependencies: + body-parser "~1.14.0" + debug "~2.2.0" + faye-websocket "~0.10.0" + livereload-js "^2.2.0" + parseurl "~1.3.0" + qs "~5.1.0" + +tmp@0.0.31: + version "0.0.31" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" + dependencies: + os-tmpdir "~1.0.1" + +tmp@0.0.x: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + dependencies: + os-tmpdir "~1.0.2" + +to-array@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + +tough-cookie@~2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.2.2.tgz#c83a1830f4e5ef0b93ef2a3488e724f8de016ac7" + +tough-cookie@~2.3.0, tough-cookie@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" + dependencies: + punycode "^1.4.1" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + +tsscmp@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.5.tgz#7dc4a33af71581ab4337da91d85ca5427ebd9a97" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tunnel-agent@~0.4.1: + version "0.4.3" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +type-is@~1.6.10, type-is@~1.6.15, type-is@~1.6.6: + version "1.6.15" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.15" + +typedarray@~0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +uglify-js@^2.8.22: + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-js@^3.0.5: + version "3.1.2" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.1.2.tgz#b50bcf15a5fd9e9ed40afbcdef3b59d6891b291f" + dependencies: + commander "~2.11.0" + source-map "~0.5.1" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uid-number@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +uid-safe@2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.4.tgz#3ad6f38368c6d4c8c75ec17623fb79aa1d071d81" + dependencies: + random-bytes "~1.0.0" + +uid-safe@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.0.0.tgz#a7f3c6ca64a1f6a5d04ec0ef3e4c3d5367317137" + dependencies: + base64-url "1.2.1" + +ultron@1.0.x: + version "1.0.2" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" + +unc-path-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + +unique-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +useragent@^2.1.12: + version "2.2.1" + resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.2.1.tgz#cf593ef4f2d175875e8bb658ea92e18a4fd06d8e" + dependencies: + lru-cache "2.2.x" + tmp "0.0.x" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +utils-merge@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + +uuid@^3.0.0, uuid@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" + +v8flags@^2.0.2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + dependencies: + user-home "^1.1.1" + +validate-npm-package-license@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + dependencies: + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" + +vary@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.0.1.tgz#99e4981566a286118dfb2b817357df7993376d10" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vhost@~3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/vhost/-/vhost-3.0.2.tgz#2fb1decd4c466aa88b0f9341af33dc1aff2478d5" + +vinyl-fs@^0.3.0: + version "0.3.14" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6" + dependencies: + defaults "^1.0.0" + glob-stream "^3.1.5" + glob-watcher "^0.0.6" + graceful-fs "^3.0.0" + mkdirp "^0.5.0" + strip-bom "^1.0.0" + through2 "^0.6.1" + vinyl "^0.4.0" + +vinyl-sourcemaps-apply@^0.2.0, vinyl-sourcemaps-apply@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705" + dependencies: + source-map "^0.5.1" + +vinyl@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.2.3.tgz#bca938209582ec5a49ad538a00fa1f125e513252" + dependencies: + clone-stats "~0.0.1" + +vinyl@^0.4.0: + version "0.4.6" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" + dependencies: + clone "^0.2.0" + clone-stats "^0.0.1" + +vinyl@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + +vinyl@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.1.0.tgz#021f9c2cf951d6b939943c89eb5ee5add4fd924c" + dependencies: + 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" + +void-elements@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" + +websocket-driver@>=0.5.1: + version "0.7.0" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" + dependencies: + http-parser-js ">=0.4.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.2.tgz#0e18781de629a18308ce1481650f67ffa2693a5d" + +when@^3.7.8: + version "3.7.8" + resolved "https://registry.yarnpkg.com/when/-/when-3.7.8.tgz#c7130b6a7ea04693e842cdc9e7a1f2aa39a39f82" + +which@^1.2.1, which@^1.2.12: + version "1.3.0" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" + dependencies: + isexe "^2.0.0" + +which@~1.2.2: + version "1.2.14" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + dependencies: + string-width "^1.0.2" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +ws@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.2.tgz#8a244fa052401e08c9886cf44a85189e1fd4067f" + dependencies: + options ">=0.0.5" + ultron "1.0.x" + +wtf-8@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a" + +xmlhttprequest-ssl@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d" + +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +xtend@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" + dependencies: + object-keys "~0.4.0" + +xtend@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" + +yauzl@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" + dependencies: + fd-slicer "~1.0.1" + +yeast@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" diff --git a/www/cluster.mustache.html b/www/cluster.mustache.html old mode 100644 new mode 100755 index 7fd0c966..3521a64a --- a/www/cluster.mustache.html +++ b/www/cluster.mustache.html @@ -1,4 +1,5 @@ + - + diff --git a/www/nodes.js b/www/nodes.js old mode 100644 new mode 100755 index 486e2ddb..238f9a70 --- a/www/nodes.js +++ b/www/nodes.js @@ -4,39 +4,69 @@ if (q) { q = q.split('+').join(' '); $('#words').val(q); $('#words').css('font-weight', 'bold'); - $('#words').change(function() { + $('#words').change(function () { $('#words').css('font-weight', 'normal'); }); }; if (window.location.pathname.endsWith('topics') || window.location.pathname.endsWith('topics.local.html')) { var i = window.location.pathname.lastIndexOf('topics'); - var base_url = window.location.origin + window.location.pathname.substr(0,i); + var base_url = window.location.origin + window.location.pathname.substr(0, i); } else { var base_url = window.location.origin + window.location.pathname; } -var combineWords = function(words) { - return d3.keys(words).sort(function(a,b) { +var combineWords = function (words) { + return d3.keys(words).sort(function (a, b) { if (words[a] > words[b]) return -1; else if (words[a] < words[b]) return 1; else return 0; - }).join(", ") + ", ..."; + }).join(", ") + ", ..."; } -var margin = {top: 20, right: 80, bottom: 80, left: 40}, +var nodeTour = new Tour({ + name: "nodeTour", + smartPlacement: false, + debug: true, + steps: [ + { + element: "#chart", + title: "Topic Map", + content: "The collection of circles below is the Topic Map. It represents the topics from the all the trained models on a two-dimensional map that attempts to place similar topics close to each other.", + placement: "top" + }, { + element: "#form-group-tour", + title: "Document Search", + content: "To limit your topic search, type in some key words for your desired topic and then click 'View Topic Clusters.' This will adjust the color saturation such that the more saturated the node is, the more relevant it is to the entered key word(s).", + placement: "top" + } + ] +}); +nodeTour.init(); + +// start tour +jQuery(document).ready(function ($){ + $('#tour-button').click(function () { + nodeTour.restart(); + }); +}); + + + + +var margin = { top: 20, right: 80, bottom: 80, left: 40 }, width = $('#chart').parent().width() - margin.left - margin.right, height = $(document).height() - Math.min($('#main').height(), 400) - margin.top - margin.bottom, padding = 1, // separation between nodes radius = 30; var x = d3.scale.linear() - .range([0, width ]); + .range([0, width]); var y = d3.scale.linear() .range([height, 0]); @@ -57,35 +87,41 @@ var yAxis = d3.svg.axis() var controls = d3.select("#chart").append("label") .attr("id", "controls") - .attr("class", "hide"); + .attr("class", "hide") var checkbox = controls.append("input") .attr("id", "collisiondetection") .attr("type", "checkbox"); controls.append("span") .text("Collision detection"); +nodeTour.addStep({ + element: "#controls", + title: "Collision Detection", + content: "Checking the collision detection checkbox will minimize overlap among the nodes but distort the underlying similarity relationships.", + placement: "top" +}); var svg = d3.select("#chart").append("svg") .attr("width", width + margin.left + margin.right) .attr("height", height + margin.top + margin.bottom) .append("g") .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); +// .attr("data-step", 4); -$(document).ready(function() { +$(document).ready(function () { $.ajaxSetup({ cache: true }); }); var ext_data; -d3.csv(base_url + "cluster.csv", function(error, data) { +d3.csv(base_url + "cluster.csv", function (error, data) { var topics = {}; var colors = {}; var node; - var ks = data.map(function(d) { return parseInt(d.k); }).filter(function(item, i, ar){ return ar.indexOf(item) === i; });; - + var ks = data.map(function (d) { return parseInt(d.k); }).filter(function (item, i, ar) { return ar.indexOf(item) === i; });; // sidebar items var cluster_view = $('#sidebar-topics li:first-child').html(); $('#sidebar-topics').html(''); if (!window.location.pathname.endsWith('topics.local.html')) $('#sidebar-topics').append('
  • ' + cluster_view + "
  • "); - ks.map(function(k) { $('#sidebar-topics').append('
  • ' + k + '
  • ') }); + ks.map(function (k) { $('#sidebar-topics').append('
  • ' + k + '
  • ') }); $('#sidebar-topics li a').tooltip(); var sizes = d3.scale.linear() @@ -94,9 +130,9 @@ d3.csv(base_url + "cluster.csv", function(error, data) { ext_data = data; var xVar = "orig_x", - yVar = "orig_y"; + yVar = "orig_y"; - data.forEach(function(d) { + data.forEach(function (d) { d[xVar] = parseFloat(d[xVar]); d[yVar] = parseFloat(d[yVar]); }); @@ -107,21 +143,24 @@ d3.csv(base_url + "cluster.csv", function(error, data) { .on("tick", tick) .charge(-1) .gravity(0); - //.chargeDistance(20); + //.chargeDistance(20); - x.domain(d3.extent(data, function(d) { return d[xVar]; })).nice(); - y.domain(d3.extent(data, function(d) { return d[yVar]; })).nice(); + x.domain(d3.extent(data, function (d) { return d[xVar]; })).nice(); + y.domain(d3.extent(data, function (d) { return d[yVar]; })).nice(); var prev = data[0].k; var currentTop = 0; // Set initial positions - data.forEach(function(d) { + data.forEach(function (d) { d.x = x(d[xVar]); d.y = y(d[yVar]); d.color = color(d.cluster); d.radius = sizes(d.k); if (d.k != prev) { prev = d.k; currentTop = 0; } d.topic = currentTop++; + if (currentTop == 0) { + d.attr() + } }); $('#chart #loading').remove(); @@ -140,11 +179,11 @@ d3.csv(base_url + "cluster.csv", function(error, data) { .attr("y", -6) .style("text-anchor", "end") .text("Sepal Width (cm)");*/ -/* - svg.append("g") - .attr("class", "y axis") - .call(yAxis); - */ + /* + svg.append("g") + .attr("class", "y axis") + .call(yAxis); + */ /* .append("text") .attr("class", "label") @@ -153,97 +192,131 @@ d3.csv(base_url + "cluster.csv", function(error, data) { .attr("dy", ".71em") .style("text-anchor", "end") .text("Sepal Length (cm)");*/ - - var k_urls = ks.map(function(k) { return base_url + k + "/topics.json" }); + + var k_urls = ks.map(function (k) { return base_url + k + "/topics.json" }); console.log(ks, k_urls); Promise.all(k_urls.map($.getJSON)).then(function (data) { - data.forEach(function(d,i) { - colors[ks[i]] = {}; - $.each(d, function(key, val) { colors[ks[i]][key] = val.color }); - }); - data.forEach(function(d,i) { - topics[ks[i]] = {}; - $.each(d, function(key, val) { topics[ks[i]][key] = combineWords(val.words) }); - }); - }).then(function() { - var words = inpho.util.getValueForURLParam('q'); - return (words) ? $.getJSON('topics.json?q=' + words) : null }) - .catch(function(error) { + data.forEach(function (d, i) { + colors[ks[i]] = {}; + $.each(d, function (key, val) { colors[ks[i]][key] = val.color }); + }); + data.forEach(function (d, i) { + topics[ks[i]] = {}; + $.each(d, function (key, val) { topics[ks[i]][key] = combineWords(val.words) }); + }); + }).then(function () { + var words = inpho.util.getValueForURLParam('q'); + return (words) ? $.getJSON('topics.json?q=' + words) : null + }) + .catch(function (error) { var words = inpho.util.getValueForURLParam('q'); if (error.status == 404) { $('#words').parents('.form-group').addClass('has-error'); $('#words').attr('placeholder', 'Terms not in corpus: "' + words + '". Try another query...'); $('#words').val(''); - } else if (error.status == 410) { + } else if (error.status == 410) { $('#words').parents('.form-group').addClass('has-warning'); $('#words').attr('placeholder', 'Terms removed by stoplisting: "' + words + '". Try another query...'); $('#words').val(''); } - }).then(function(distData) { + }).then(function (distData) { if (distData != null) { - $('#words').parents('.form-group').removeClass('has-error'); - $('#words').parents('.form-group').removeClass('has-warning'); - $('#words').parents('.form-group').addClass('has-success'); - opacity.domain(d3.extent(distData, function(d) { return d['distance']; })).nice(); - for (var obj in distData) { - obj = distData[obj]; - data.map(function(d) { if (d.k == obj.k.toString() && d.topic == obj.t) d.opacity = obj.distance; }); - } + $('#words').parents('.form-group').removeClass('has-error'); + $('#words').parents('.form-group').removeClass('has-warning'); + $('#words').parents('.form-group').addClass('has-success'); + opacity.domain(d3.extent(distData, function (d) { return d['distance']; })).nice(); + for (var obj in distData) { + obj = distData[obj]; + data.map(function (d) { if (d.k == obj.k.toString() && d.topic == obj.t) d.opacity = obj.distance; }); + } } - }).then(function() { + }).then(function () { console.log(data); node = svg.selectAll(".dot") - .data(data, function(d) { return d.k + '-' + d.topic; }) + .data(data, function (d) { return d.k + '-' + d.topic; }) .enter().append("circle") - .attr("class", "dot") - .attr("id", function(d) { return d.k + '_' + d.topic; }) - .attr("r", function(d) { return d.radius; }) - .attr("cx", function(d) { return x(d[xVar]); }) - .attr("cy", function(d) { return y(d[yVar]); }) - .style("fill", function(d) { return d.color; }) - .style("fill-opacity", function(d) { return opacity(d.opacity) || 0.7; }) - .on("click", function(d) { window.location.href = base_url + d.k + "/?topic=" + d.topic }) - .attr("title", function(d) { - return "Topic " + d.topic + " (k=" + d.k + ")" - + "
    " + topics[d.k][d.topic]; - }) - .on("mouseover", function (d) { $(this).tooltip('show')}) - .on("mouseout", function (d) { $(this).tooltip('hide')}); - - $(".dot").tooltip({container:'body', trigger: 'manual', animation: false, html: true}); - - }); -/* - var legend = svg.selectAll(".legend") - .data(color.domain()) - .enter().append("g") - .attr("class", "legend") - .attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; }); - - legend.append("rect") - .attr("x", width - 18) - .attr("width", 18) - .attr("height", 18) - .style("fill", color); - - legend.append("text") - .attr("x", width - 24) - .attr("y", 9) - .attr("dy", ".35em") - .style("text-anchor", "end") - .text(function(d) { return d; }); -*/ - d3.select("#collisiondetection").on("change", function() { + .attr("class", "dot") + .attr("id", function (d) { return d.k + '_' + d.topic; }) + .attr("r", function (d) { return d.radius; }) + .attr("cx", function (d) { return x(d[xVar]); }) + .attr("cy", function (d) { return y(d[yVar]); }) + + .attr("data-step", function (d) { + if ((d.k + "_" + d.topic) === "20_0") { + nodeTour.addStep({ + element: "#20_0", + title: "Topic Circles", + smartPlacement: false, + debug: true, + content: "Clicking on any topic circle will take you to the Hypershelf with the top documents for that topic already selected.", + placement: "top", + autoscroll: "false" + }); + nodeTour.addStep({ + element: "#home-page", + title: "Home Page", + content: "Click here to return to the home page.", + placement: "bottom", + autoscroll: "false" + }); + } else { + return -1; + } + }) + .attr("data-intro", function (d) { + if ((d.k + "_" + d.topic) === "20_0") { + //return "Clicking on any topic circle will take you to the Hypershelf with the top documents for that topic already selected."; + return "clicking"; + } else { + return -1; + } + }) + + .style("fill", function (d) { return d.color; }) + .style("fill-opacity", function (d) { return opacity(d.opacity) || 0.7; }) + .on("click", function (d) { window.location.href = base_url + d.k + "/?topic=" + d.topic }) + .attr("title", function (d) { + return "Topic " + d.topic + " (k=" + d.k + ")" + + "
    " + topics[d.k][d.topic]; + }) + .on("mouseover", function (d) { $(this).tooltip('show') }) + .on("mouseout", function (d) { $(this).tooltip('hide') }); + + $(".dot").tooltip({ container: 'body', trigger: 'manual', animation: false, html: true }); + + }); + + /* + var legend = svg.selectAll(".legend") + .data(color.domain()) + .enter().append("g") + .attr("class", "legend") + .attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; }); + + legend.append("rect") + .attr("x", width - 18) + .attr("width", 18) + .attr("height", 18) + .style("fill", color); + + legend.append("text") + .attr("x", width - 24) + .attr("y", 9) + .attr("dy", ".35em") + .style("text-anchor", "end") + .text(function(d) { return d; }); + */ + d3.select("#collisiondetection").on("change", function () { if (!checkbox.node().checked) - force + force .charge(0) .gravity(0) //.chargeDistance(0) .start(); else - force + force .charge(-1) .gravity(0) //.chargeDistance(20) @@ -256,12 +329,12 @@ d3.csv(base_url + "cluster.csv", function(error, data) { if (checkbox.node().checked) node.each(collide(e.alpha)); - node.attr("cx", function(d) { return d.x; }) - .attr("cy", function(d) { return d.y; }); + node.attr("cx", function (d) { return d.x; }) + .attr("cy", function (d) { return d.y; }); } function moveTowardDataPosition(alpha) { - return function(d) { + return function (d) { d.x += (x(d[xVar]) - d.x) * 0.1 * alpha; d.y += (y(d[yVar]) - d.y) * 0.1 * alpha; }; @@ -270,18 +343,18 @@ d3.csv(base_url + "cluster.csv", function(error, data) { // Resolve collisions between nodes. function collide(alpha) { var quadtree = d3.geom.quadtree(data); - return function(d) { + return function (d) { var r = d.radius + radius + padding, - nx1 = d.x - r, - nx2 = d.x + r, - ny1 = d.y - r, - ny2 = d.y + r; - quadtree.visit(function(quad, x1, y1, x2, y2) { + nx1 = d.x - r, + nx2 = d.x + r, + ny1 = d.y - r, + ny2 = d.y + r; + quadtree.visit(function (quad, x1, y1, x2, y2) { if (quad.point && (quad.point !== d)) { var x = d.x - quad.point.x, - y = d.y - quad.point.y, - l = Math.sqrt(x * x + y * y), - r = d.radius + quad.point.radius + (d.color !== quad.point.color) * padding; + y = d.y - quad.point.y, + l = Math.sqrt(x * x + y * y), + r = d.radius + quad.point.radius + (d.color !== quad.point.color) * padding; if (l < r) { l = (l - r) / l * alpha; d.x -= x *= l; @@ -296,20 +369,20 @@ d3.csv(base_url + "cluster.csv", function(error, data) { } }); -var toggleDisplay = function(k) { - var selection = d3.selectAll(".dot").filter(function(d) { return d.k.toString() == k.toString() }); +var toggleDisplay = function (k) { + var selection = d3.selectAll(".dot").filter(function (d) { return d.k.toString() == k.toString() }); console.log(selection); if (selection.style('display') == 'none') { selection.style('display', 'inline'); $('.sidebar-nav li a') - .filter(function() { return $(this).text() == k.toString() }) - .addClass('bg-info'); + .filter(function () { return $(this).text() == k.toString() }) + .addClass('bg-info'); } else { selection.style('display', 'none'); $('.sidebar-nav li a') - .filter(function() { return $(this).text() == k.toString() }) - .removeClass('bg-info'); + .filter(function () { return $(this).text() == k.toString() }) + .removeClass('bg-info'); } } diff --git a/www/splash.mustache.html b/www/splash.mustache.html old mode 100644 new mode 100755 index e165d62c..1c427c97 --- a/www/splash.mustache.html +++ b/www/splash.mustache.html @@ -1,50 +1,86 @@ - + + + -
    -
    -
    -

    InPhO Topic Explorer

    -

    - {{#corpus_link}}{{corpus_name}}{{/corpus_link}} - {{^corpus_link}}{{corpus_name}}{{/corpus_link}}
    - About this corpus

    -

    Topic models are about contexts, rather than individual words.
    - We search a topic model using full documents, rather than keywords.
    Enter the model by one of the following methods:

    -
    -
    - -
    Document -
    -
    -
    -
    Topic
    -
    -
    - -
    + + +
    +
    +
    +

    InPhO + Topic Explorer

    +

    + {{#corpus_link}}{{corpus_name}}{{/corpus_link}} + {{^corpus_link}}{{corpus_name}}{{/corpus_link}}
    + About this corpus
    +
    +
    +
    -
    -
    -

    About this corpus
    - Back to top

    -
    +

    +

    Topic models are about contexts, rather than individual words.
    + We search a topic model using full documents, rather than keywords.
    Enter the model by one of the + following methods:

    +
    +
    + Back to top

    -
    + You will be shown a “fingerprint” for the selected document, and you can navigate from this to the Hypershelf focused on that document."> +
    Document + +
    +
    +
    Topic
    +
    +
    + +
    + +
    +
    +

    About this corpus
    + Back to top

    +
    +
    - -
    -
    + + @@ -98,28 +139,84 @@
    -

    After typing words above, the topics most likely to generate that word will appear below. Clicking "View topic clusters" will go to a view of the topic space, weighted by the terms in the box. This makes it easy to find groups of topics related to your interests.

    +

    After typing words above, the topics most likely to generate that word will appear below. Clicking "View + topic clusters" will go to a view of the topic space, weighted by the terms in the box. This makes it easy to + find groups of topics related to your interests.

    - + - + + + + \ No newline at end of file diff --git a/www/topicprint.js b/www/topicprint.js old mode 100644 new mode 100755 index e9c3b195..7704e366 --- a/www/topicprint.js +++ b/www/topicprint.js @@ -1,62 +1,152 @@ var taTimeout; -$(".typeahead").typeahead({items: 12, - source: function(query, process) { +$(".typeahead").typeahead({ + items: 12, + source: function (query, process) { if (taTimeout) clearTimeout(taTimeout); this.$menu.find('.active').removeClass('active'); - var processAutocomplete = function(data) { - labels = []; - mapped = {}; - $.each(data, function(i, item) { - mapped[item.label] = item; - labels.push(item.label); - }) - - process(labels); + var processAutocomplete = function (data) { + labels = []; + mapped = {}; + $.each(data, function (i, item) { + mapped[item.label] = item; + labels.push(item.label); + }) + + process(labels); }; taTimeout = setTimeout(function () { $.getJSON('../docs.json?q=' + encodeURIComponent(query), processAutocomplete) - .error(function() { - $.getJSON('docs.json?q=' + encodeURIComponent(query), processAutocomplete) - })}, 300); + .error(function () { + $.getJSON('docs.json?q=' + encodeURIComponent(query), processAutocomplete) + }) + }, 300); }, - updater: function(item) { - if (!item) { - $('#hidden_id').val(''); - return this.$element.val(); - } else { - $('#hidden_id').val(mapped[item].id); - resetBars(); - return item; - } + updater: function (item) { + if (!item) { + $('#hidden_id').val(''); + return this.$element.val(); + } else { + $('#hidden_id').val(mapped[item].id); + resetBars(); + return item; + } }, - sorter: function(items) { - /*if (items.length == 1) { - $('#hidden_id').val(mapped[items[0]].id); - console.log("setting hidden_id" + $('#hidden_id').val()); - if (!$('#autocompleteDoc').hasClass('active')) { - $('#autocompleteDoc').addClass('active'); - $('span.icon-font', '#autocompleteDoc').removeClass('icon-font').addClass('icon-file'); - } - items.length = 0; - } else*/ - var query = this.query; - items = items.sort(); - var start = items.filter(function(item) { return item.lastIndexOf(query, 0) == 0;}); - var elsewhere = items.filter(function(item) { return item.lastIndexOf(query, 0) != 0;}); - return start.concat(elsewhere); + sorter: function (items) { + /*if (items.length == 1) { + $('#hidden_id').val(mapped[items[0]].id); + console.log("setting hidden_id" + $('#hidden_id').val()); + if (!$('#autocompleteDoc').hasClass('active')) { + $('#autocompleteDoc').addClass('active'); + $('span.icon-font', '#autocompleteDoc').removeClass('icon-font').addClass('icon-file'); + } + items.length = 0; + } else*/ + var query = this.query; + items = items.sort(); + var start = items.filter(function (item) { return item.lastIndexOf(query, 0) == 0; }); + var elsewhere = items.filter(function (item) { return item.lastIndexOf(query, 0) != 0; }); + return start.concat(elsewhere); } }); -$('#randomDoc', '#fingerprintModal').click(function() { - $.getJSON(fingerprint.host + 'docs.json?random=1', function(rand) { - $('#hidden_id', '#fingerprintModal').val(rand[0].id); - $('#doc', '#fingerprintModal').val(rand[0].label); - resetBars(); +var tour = new Tour({ + steps: [ + { + element: "#doc", + title: "Document Selection", + content: "There are a few ways to select a new focal document. One is by typing in a few letters in the focal document entry area.", + placement: "top" + }, { + element: "#randomDoc", + title: "Random Document Selection", + content: "You can also click the crossed arrows button to the right of the focal document entry area for a random document.", + placement: "top" + }, { + element: "#tutorial", + title: "Random Document Selection", + content: "You may use this button to visualize the focal document and you may use the dropdown menu attached to the button to switch to a model with a different number of topics.", + placement: "top" + }, { + element: "#visualize_button", + title: "Continuation of Tutorial", + content: "From this point onwards, you can either exit the tutorial, type in a document yourself and click the visualize button, or you can click 'next' and allow the tutorial to pick a document for you.", + placement: "bottom", + onNext: function(tour) { + $("#randomDoc").click(); + //console.log(document.getElementById("#doc").value); + //$("#submit").click(); + + setTimeout(function () { + $("#submit").click(); + }, 500); + /* + if(tour.started() && !tour.ended()) + { + tour.init(); + tour.start(); + } + */ + + }, + + }, { + element:"#chart", + title: "Hypershelf", + content: "The Hypershelf shows up to 40 documents that are most similar to the focal document. Each document is represented by a bar whose colors show the mixture and proportions of topics assigned to each document by the training process. The relative lengths of the bars indicate the degree of similarity to the focal document according to the topic mixtures. \n\nThis is a legend designed to navigate and manipulate data on the Hypershelf easier. You can click on any of the colored squares to focus on a particular topic, alphabetize the papers, and normalize the topic bars.", + placement: "top", + delay: 1000 + //autoscroll: false, + //smartPlacement: false + + }, + + { + element:"#legend", + title: "Legend", + content: "On the right is a legend designed to navigate and manipulate data on the Hypershelf easier. You can click on any of the colored squares to focus on a particular topic, alphabetize the papers, and normalize the topic bars.", + placement:"left" + }, + { + element: "#docDemonstration", + title: "Documents", + content:"The Hypershelf shows up to 40 documents that are most similar to the focal document. Each document is represented by a bar whose colors show the mixture and proportions of topics assigned to each document by the training process. The relative lengths of the bars indicate the degree of similarity to the focal document according to the topic mixtures.", + placement:"bottom" + }, + + { + element: "#home-page", + title: "Home Page", + content: "Click on this to return to the home page", + placement: "bottom" + } + + ] +}); +tour.init(); + +if(!tour.ended()) + { + tour.init(); + tour.start(); + } + +// start tour +jQuery(document).ready(function ($){ + $('#tour-button').click(function () { + tour.restart(); + }); +}); + +$('#randomDoc', '#fingerprintModal').click(function () { + $.getJSON(fingerprint.host + 'docs.json?random=1', function (rand) { + $('#hidden_id', '#fingerprintModal').val(rand[0].id); + $('#doc', '#fingerprintModal').val(rand[0].label); + resetBars(); }); }); -$('#randomDoc', '#fingerprintModal').tooltip({title: "Random Document", placement: 'bottom'}); +$('#randomDoc', '#fingerprintModal').tooltip({ title: "Random Document", placement: 'bottom' }); function resetBars() { $('#singleBarsDl').html(''); @@ -66,150 +156,155 @@ function resetBars() { function resetBar(i, k) { var base_bar = - '
    ' - + '
    ' - + '
    ' - + '
    Loading documents...
    ' - + '
    ' - + '
    ' - + '
    ' - + '
    '; - + '
    ' + + '
    ' + + '
    ' + + '
    Loading documents...
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    '; + $('#fingerprintModal #topicBars dl').append(base_bar); fingerprint.visualize(k); - + } function showFingerprint(id, label) { $('#doc', '#fingerprintModal').val(label); $('#hidden_id', '#fingerprintModal').val(id); $('#fingerprintModal').modal('show'); - $('#fingerprintModal').on('shown.bs.modal', - function(e) { - if (!$('dd', '#singleBarsDl').length) - resetBars() + $('#fingerprintModal').on('shown.bs.modal', + function (e) { + if (!$('dd', '#singleBarsDl').length) + resetBars() }); } var fingerprint = { - 'host' : '', - 'visualize' : function(k) { - + 'host': '', + 'visualize': function (k) { + var maxRows = 25; var minCols = 2; - + //${c.entity.sep_dir} var docid = $('#fingerprintModal #hidden_id').val(); if (!docid || docid == '') return; - + var width = $('#fingerprintModal .bar-container').width(), - height = 20; - + height = 20; + var x = d3.scale.linear() - .range([0, width]) - .domain([0,1.0]); - // TODO: Clear existing #bar{k} content - var svg = d3.select("#bar"+k+" #chart").insert("svg") - .attr("width", width) - .attr("height", height) - .attr("id","main") - .attr("class", "main"); - $('#bar'+k).hide(); - - function calculateTopicMap(data, scale, sortFn){ - data.forEach(function(d) { + .range([0, width]) + .domain([0, 1.0]); + // TODO: Clear existing #bar{k} content + var svg = d3.select("#bar" + k + " #chart").insert("svg") + .attr("width", width) + .attr("height", height) + .attr("class", "main"); + $('#bar' + k).hide(); + + function calculateTopicMap(data, scale, sortFn) { + data.forEach(function (d) { var sizeFactor = (scale) ? d.prob : 1.0 var x0 = 0; - if (sortFn) d.topicMap = d3.keys(d.topics) + if (sortFn) d.topicMap = d3.keys(d.topics) .sort(sortFn) - .map(function(name) { return {name: name, x0: x0, x1: x0 += +(d.topics[name]*sizeFactor) }; }); + .map(function (name) { return { name: name, x0: x0, x1: x0 += +(d.topics[name] * sizeFactor) }; }); else d.topicMap = d3.keys(d.topics) - .map(function(name) { return {name: name, x0: x0, x1: x0 += +(d.topics[name]*sizeFactor) }; }); + .map(function (name) { return { name: name, x0: x0, x1: x0 += +(d.topics[name] * sizeFactor) }; }); }); - + } - + var url = "/docs_topics/" + $('#fingerprintModal #hidden_id').val() + '.json?n=1' var host = fingerprint.host + k; - - d3.json(host + url, function(error, data) { - $('#fingerprintModal #status .bar', '#bar'+k).css('width', '50%').text('Loading topics...'); + + d3.json(host + url, function (error, data) { + $('#fingerprintModal #status .bar', '#bar' + k).css('width', '50%').text('Loading topics...'); if (error) { var isError = $('.bar.bar-danger '); - $('#fingerprintModal #status .progress', '#bar'+k).removeClass('active progress-striped'); - if(isError[0]){ - $('#fingerprintModal #status .progress', '#bar'+k).remove(); + $('#fingerprintModal #status .progress', '#bar' + k).removeClass('active progress-striped'); + if (isError[0]) { + $('#fingerprintModal #status .progress', '#bar' + k).remove(); } - else{ + else { var errormsg = "Invalid document: " + docid + "."; - $('#fingerprintModal #status .bar', '#bar'+k).addClass('bar-danger').text(errormsg); + $('#fingerprintModal #status .bar', '#bar' + k).addClass('bar-danger').text(errormsg); } return false; } - d3.json(host + "/topics.json", function(error_top, topics) { - $('#fingerprintModal #status .bar', '#bar'+k).css('width', '75%').text('Rendering chart...'); + d3.json(host + "/topics.json", function (error_top, topics) { + $('#fingerprintModal #status .bar', '#bar' + k).css('width', '75%').text('Rendering chart...'); if (error_top) { - var isError = $('.bar.bar-danger '); - $('#fingerprintModal #status .progress', '#bar'+k).removeClass('active progress-striped'); - if(isError[0]){ - $('#fingerprintModal #status .progress', '#bar'+k).remove(); + var isError = $('.bar.bar-danger '); + $('#fingerprintModal #status .progress', '#bar' + k).removeClass('active progress-striped'); + if (isError[0]) { + $('#fingerprintModal #status .progress', '#bar' + k).remove(); } - else{ - $('#fingerprintModal #status .bar', '#bar'+k).addClass('bar-danger').text('Could not load topic list.'); + else { + $('#fingerprintModal #status .bar', '#bar' + k).addClass('bar-danger').text('Could not load topic list.'); } return false; } - + var k = d3.keys(topics).length; - var full_explorer_url = host+"/?doc="+encodeURIComponent(docid); - - calculateTopicMap(data, true, function(a,b) {return data[0].topics[b] - data[0].topics[a];}); - + var full_explorer_url = host + "/?doc=" + encodeURIComponent(docid); + + calculateTopicMap(data, true, function (a, b) { return data[0].topics[b] - data[0].topics[a]; }); + // draw total bar var doc = svg.selectAll("doc") - .data(data) + .data(data) .enter().append("g") - .attr("class","doc"); - + .attr("class", "doc") + .attr("id",data); + // Draw topic bars doc.selectAll("rect") - .data(function(d) { return d.topicMap; }) + .data(function (d) { return d.topicMap; }) .enter().append("rect") - .attr("height", height) - .attr("x", function(d) { return x(d.x0); }) - .attr("width", function(d) { return x(d.x1) - x(d.x0); }) - .attr("class", function(d) { return "top_" + d.name; }) - .attr("title", function(d) { return d3.keys(topics[d.name]['words']).sort(function(a,b) { - if (topics[d.name]['words'][a] > topics[d.name]['words'][b]) - return -1; - else if (topics[d.name]['words'][a] < topics[d.name]['words'][b]) - return 1; - else - return 0; - }).join(", ") + ", ..."; }) - .on("mouseover", function(d) { - // SVG element z-index determined by render order, not style sheet - // so element must be reappended to the end on hover so border - // is not occluded - var parent = $(this).parent(); - $(this).detach().appendTo(parent); - }) - .on("click", function(d) { window.location = full_explorer_url; }) - .style("fill", function(d) { return barColors(colors[k][d.name], d.name, svg); }); - - $(".doc rect").tooltip({container:'body', - animation: false, placement: 'top'}); - - $('#status .bar', '#bar'+k).addClass('bar-success').css('width', '100%').text("Complete!"); - setTimeout(function() {$('#status', '#bar'+k).hide()}, 250); - setTimeout(function() { + .attr("height", height) + .attr("x", function (d) { return x(d.x0); }) + .attr("width", function (d) { return x(d.x1) - x(d.x0); }) + .attr("class", function (d) { return "top_" + d.name; }) + .attr("title", function (d) { + return d3.keys(topics[d.name]['words']).sort(function (a, b) { + if (topics[d.name]['words'][a] > topics[d.name]['words'][b]) + return -1; + else if (topics[d.name]['words'][a] < topics[d.name]['words'][b]) + return 1; + else + return 0; + }).join(", ") + ", ..."; + }) + .on("mouseover", function (d) { + // SVG element z-index determined by render order, not style sheet + // so element must be reappended to the end on hover so border + // is not occluded + var parent = $(this).parent(); + $(this).detach().appendTo(parent); + }) + .on("click", function (d) { window.location = full_explorer_url; }) + .style("fill", function (d) { return barColors(colors[k][d.name], d.name, svg); }); + + $(".doc rect").tooltip({ + container: 'body', + animation: false, placement: 'top' + }); + + $('#status .bar', '#bar' + k).addClass('bar-success').css('width', '100%').text("Complete!"); + setTimeout(function () { $('#status', '#bar' + k).hide() }, 250); + setTimeout(function () { $('#loading').hide(); - $('#bar'+k).show(); - $("#bar" + k).before("
    "+k+" Topics
    "); - }, 250); - - }); }); - } + $('#bar' + k).show(); + $("#bar" + k).before("
    " + k + " Topics
    "); + }, 250); + + }); + }); + } }; @@ -218,54 +313,56 @@ var fingerprint = { //splash.mustache.html var converter = new showdown.Converter({ - simplifiedAutoLink: true, - headerLevelStart : 3, - literalMidWordUnderscores: true, - strikethrough: true, - tables: true + simplifiedAutoLink: true, + headerLevelStart: 3, + literalMidWordUnderscores: true, + strikethrough: true, + tables: true }); -var insertAboutText = function(data) { - var html = converter.makeHtml(data); - $('#aboutText').html(html); - } +var insertAboutText = function (data) { + var html = converter.makeHtml(data); + $('#aboutText').html(html); +} $.get('description.md') .done(insertAboutText) - .fail(function() { + .fail(function () { $.get('../description.md') .done(insertAboutText) .fail( - function(data) { $('#aboutText').html('To add a description of this corpus, create a Markdown file and edit the main:corpus_desc option in config.ini.'); -})}); - -var combineWords = function(words) { - return d3.keys(words).sort(function(a,b) { - if (words[a] > words[b]) - return -1; - else if (words[a] < words[b]) - return 1; - else - return 0; - }).join(", ") + ", ..."; + function (data) { + $('#aboutText').html('To add a description of this corpus, create a Markdown file and edit the main:corpus_desc option in config.ini.'); + }) + }); + +var combineWords = function (words) { + return d3.keys(words).sort(function (a, b) { + if (words[a] > words[b]) + return -1; + else if (words[a] < words[b]) + return 1; + else + return 0; + }).join(", ") + ", ..."; } var wordTimeout; -$('#words').on('input', function() { +$('#words').on('input', function () { if (wordTimeout) clearTimeout(wordTimeout); var words = $(this).val().split(' '); - wordTimeout = setTimeout(function() { - gettopics(words); + wordTimeout = setTimeout(function () { + gettopics(words); $('#wordsBtn').attr('href', 'topics?q=' + words.join('+')); $('#wordsBtn2').attr('href', 'topics?q=' + words.join('+')); }, 500); }); -var k_urls = ks.map(function(k) { return '../' + k + "/topics.json" }); +var k_urls = ks.map(function (k) { return '../' + k + "/topics.json" }); var topics = Promise.all(k_urls.map($.getJSON)).then(function (data) { - var t = {}; - data.forEach(function(d,i) { - t[ks[i]] = {}; - $.each(d, function(key, val) { t[ks[i]][key] = combineWords(val.words) }); + var t = {}; + data.forEach(function (d, i) { + t[ks[i]] = {}; + $.each(d, function (key, val) { t[ks[i]][key] = combineWords(val.words) }); }); return t; }); @@ -275,10 +372,10 @@ var color = d3.scale.category20(); d3.csv('../cluster.csv', function (error, data) { var prev = data[0].k; var currentTop = 0; - data.forEach(function(d) { + data.forEach(function (d) { if (d.k != prev) { prev = d.k; currentTop = 0; } d.topic = currentTop++; - d.color = color(d.cluster); + d.color = color(d.cluster); if (colors[d.k] == undefined) colors[d.k] = {}; colors[d.k][d.topic] = d.color; }) @@ -288,39 +385,39 @@ function gettopics(words) { var query = words.join('|'); $('#wordsDl').html('') $.getJSON('topics.json?q=' + query) - .error(function(error) { - console.log(error); - if (error.status == 404) { - $('#words').parents('.form-group').addClass('has-error'); - $('#words').attr('placeholder', 'Terms not in corpus: "' + words + '". Try another query...'); - $('#words').val(''); - } else if (error.status == 410) { - $('#words').parents('.form-group').addClass('has-warning'); - $('#words').attr('placeholder', 'Terms removed by stoplisting: "' + words + '". Try another query...'); - $('#words').val(''); - } - }).success(function(data) { - $('#words').parents('.form-group').removeClass('has-error'); - $('#words').parents('.form-group').removeClass('has-warning'); - $('#words').parents('.form-group').addClass('has-success'); - Promise.resolve(topics).then(function(val) { - for (var i = 0; i < 10; i++) { - var k = data[i]['k']; - var t = data[i]['t']; - - /*$('#wordsDl').append('
    ' + - 'Topic ' + t + - ' (k = ' + k + ')
    '); - $('#wordsDl').append('
    ' + - val[k][t] + '
    '); }*/ - $('#wordsDl').append('

    ' + - 'Topic ' + t + - ' (k = ' + k + ')

    ' + - val[k][t] + '

    '); + .error(function (error) { + console.log(error); + if (error.status == 404) { + $('#words').parents('.form-group').addClass('has-error'); + $('#words').attr('placeholder', 'Terms not in corpus: "' + words + '". Try another query...'); + $('#words').val(''); + } else if (error.status == 410) { + $('#words').parents('.form-group').addClass('has-warning'); + $('#words').attr('placeholder', 'Terms removed by stoplisting: "' + words + '". Try another query...'); + $('#words').val(''); } - $('#wordsDl').append('
     
    '); + }).success(function (data) { + $('#words').parents('.form-group').removeClass('has-error'); + $('#words').parents('.form-group').removeClass('has-warning'); + $('#words').parents('.form-group').addClass('has-success'); + Promise.resolve(topics).then(function (val) { + for (var i = 0; i < 10; i++) { + var k = data[i]['k']; + var t = data[i]['t']; + + /*$('#wordsDl').append('
    ' + + 'Topic ' + t + + ' (k = ' + k + ')
    '); + $('#wordsDl').append('
    ' + + val[k][t] + '
    '); }*/ + $('#wordsDl').append('

    ' + + 'Topic ' + t + + ' (k = ' + k + ')

    ' + + val[k][t] + '

    '); + } + $('#wordsDl').append('
     
    '); + }); }); - }); } @@ -334,8 +431,9 @@ function gettopics(words) { var topDoc = document.getElementById("topicBtn"); var mainDoc = document.getElementById("doc"); $(window).load(function () { - //Breaks out of function when there are no topic bars, like on the landing page - if (topDoc == null) return; + //Breaks out of function when there are no topic bars, like on the landing page + if (topDoc == null) return; + if (mainDoc.value == "") { if (roottopic == null) { $("#focalDoc").text(""); @@ -347,7 +445,7 @@ $(window).load(function () { else { topDoc.style.display = 'block'; if (roottopic == null) { - $("#focalDoc").text("Top 40 documents most similar to the focal document"); + $("#focalDoc").text("Top 40 documents most similar to the focal document"); } else { $("#focalDoc").text("Top 40 documents most similar to topic " + roottopic); } @@ -356,42 +454,42 @@ $(window).load(function () { $(document).ready(function () { $('#cite').hide(); - $('#citeBtn').tooltip({title: "Show citation info", placement: 'bottom'}); + $('#citeBtn').tooltip({ title: "Show citation info", placement: 'bottom' }); var visited = document.cookie.replace(/(?:(?:^|.*;\s*)visited\s*\=\s*([^;]*).*$)|^.*$/, "$1"); if (visited != null) { $('.help').hide(); - $('#helpBtn').tooltip({title: "Show help", placement: 'bottom'}); + $('#helpBtn').tooltip({ title: "Show help", placement: 'bottom' }); } else { - $('#helpBtn').tooltip({title: "Hide help", placement: 'bottom'}); + $('#helpBtn').tooltip({ title: "Hide help", placement: 'bottom' }); $('#helpBtn').addClass('active'); } document.cookie = "visited=true; max-age=31536000;"; }); var scrollLegend; -$('#helpBtn').click(function() { - $('.help').toggle(); - if (!$('#helpBtn').hasClass('active')) { - $('#helpBtn').data('tooltip').options.title = "Hide help"; - $('#helpBtn').addClass('active'); - } else { - $('#helpBtn').data('tooltip').options.title = "Show help"; - $('#helpBtn').removeClass('active'); - } - scrollLegend(); - }); -$('#citeBtn').click(function() { - $('#cite').toggle(); - if (!$('#citeBtn').hasClass('active')) { - $('#citeBtn').data('tooltip').options.title = "Hide citation info"; - $('#citeBtn').addClass('active'); - } else { - $('#citeBtn').data('tooltip').options.title = "Show citation info"; - $('#citeBtn').removeClass('active'); - } - scrollLegend(); - }); +$('#helpBtn').click(function () { + $('.help').toggle(); + if (!$('#helpBtn').hasClass('active')) { + $('#helpBtn').data('tooltip').options.title = "Hide help"; + $('#helpBtn').addClass('active'); + } else { + $('#helpBtn').data('tooltip').options.title = "Show help"; + $('#helpBtn').removeClass('active'); + } + scrollLegend(); +}); +$('#citeBtn').click(function () { + $('#cite').toggle(); + if (!$('#citeBtn').hasClass('active')) { + $('#citeBtn').data('tooltip').options.title = "Hide citation info"; + $('#citeBtn').addClass('active'); + } else { + $('#citeBtn').data('tooltip').options.title = "Show citation info"; + $('#citeBtn').removeClass('active'); + } + scrollLegend(); +}); var q = inpho.util.getValueForURLParam('q') || null; if (q) { @@ -400,43 +498,43 @@ if (q) { } $('#doc').css('font-weight', 'bold'); -$('#doc').on('change', function() { $(this).css('font-weight', 'normal')}); +$('#doc').on('change', function () { $(this).css('font-weight', 'normal') }); var docid = inpho.util.getValueForURLParam('doc') || null; if (docid) { docid = decodeURIComponent(docid); $('#hidden_id').val(docid); - $('.twitter-share-button').attr('data-text', "What's similar to " +docid+"? Discover with the #InPhO Topic Explorer"); - $.getJSON('../docs.json?id='+encodeURIComponent(docid), function(title) { + $('.twitter-share-button').attr('data-text', "What's similar to " + docid + "? Discover with the #InPhO Topic Explorer"); + $.getJSON('../docs.json?id=' + encodeURIComponent(docid), function (title) { if (title.length) { title = title[0].label; - $('.title').html('{{doc_title_format}}'.format(title,'{{doc_url_format}}'.format(docid))); + $('.title').html('{{doc_title_format}}'.format(title, '{{doc_url_format}}'.format(docid))); $('#doc').val(title); $('#autocompleteDoc').removeAttr('disabled').button('toggle'); $('span.glyphicon-font', '#autocompleteDoc').removeClass('glyphicon-font').addClass('glyphicon-file'); - $('.twitter-share-button').attr('data-text', "What's similar to " + title +"? Discover with the #InPhO Topic Explorer!"); + $('.twitter-share-button').attr('data-text', "What's similar to " + title + "? Discover with the #InPhO Topic Explorer!"); } else { - $('.title').html('{{doc_title_format}}'.format(docid,'{{doc_url_format}}'.format(docid))); + $('.title').html('{{doc_title_format}}'.format(docid, '{{doc_url_format}}'.format(docid))); $('#doc').val(docid); } }); } else if (q) { - $('#search-label').html("Words") - $('.title').html('the query "'+q+'"'); - $('#doc').val(q); -/* TODO: Migrate to call /docs.json?q=q - title = data.filter(function(item) { return item.label.toLowerCase().indexOf(q.toLowerCase()) >= 0 }); - if (title.length) { - $('#autocompleteDoc').removeAttr('disabled'); - } - */ + $('#search-label').html("Words") + $('.title').html('the query "' + q + '"'); + $('#doc').val(q); + /* TODO: Migrate to call /docs.json?q=q + title = data.filter(function(item) { return item.label.toLowerCase().indexOf(q.toLowerCase()) >= 0 }); + if (title.length) { + $('#autocompleteDoc').removeAttr('disabled'); + } + */ } var roottopic = inpho.util.getValueForURLParam('topic') || null; if (roottopic) { $('.title').html('Topic ' + roottopic); - $('.twitter-share-button').attr('data-text', "Check out topic "+ roottopic+" at the #InPhO Topic Explorer!"); + $('.twitter-share-button').attr('data-text', "Check out topic " + roottopic + " at the #InPhO Topic Explorer!"); $('.topdoc').text('Top Documents for Topic ' + roottopic); $('.topdoc').css('font-weight', 'bold'); $('.topdoc').addClass('btn-default'); @@ -449,8 +547,8 @@ if (docid || roottopic || q) else $('.null').show(); -$('#searchForm').submit(function(event) { - visualize(); +$('#searchForm').submit(function (event) { + visualize(); event.preventDefault(); }); @@ -458,10 +556,10 @@ function visualize(k) { var url = "{0}{1}".format(window.location.origin, window.location.pathname); if (k && tops) url = url.replace('/' + Object.keys(tops).length + '/', - '/' + k + '/'); + '/' + k + '/'); if ($("#autocompleteDoc").hasClass('active') && !($("#autocompleteDoc").attr("disabled") == 'disabled')) { - url += "?doc=" + encodeURIComponent($("#hidden_id").val() || docid) ; + url += "?doc=" + encodeURIComponent($("#hidden_id").val() || docid); } else { url += "?q=" + encodeURIComponent($("#doc").val()).replace(/%20/g, '|'); } @@ -470,71 +568,73 @@ function visualize(k) { } var taTimeout; -$(".typeahead").typeahead({items: 12, - source: function(query, process) { +$(".typeahead").typeahead({ + items: 12, + source: function (query, process) { if (taTimeout) clearTimeout(taTimeout); this.$menu.find('.active').removeClass('active'); taTimeout = setTimeout(function () { - $.getJSON('../docs.json?q=' + encodeURIComponent(query), function(data) { + $.getJSON('../docs.json?q=' + encodeURIComponent(query), function (data) { labels = []; mapped = {}; - $.each(data, function(i, item) { + $.each(data, function (i, item) { mapped[item.label] = item; labels.push(item.label); }); - + process(labels); - })}, 300); + }) + }, 300); }, - updater: function(item) { - if (!item) { - if ($('#autocompleteDoc').hasClass('active')) { - $('#autocompleteDoc').removeClass('active'); - $('span.glyphicon-file', '#autocompleteDoc').removeClass('glyphicon-file').addClass('glyphicon-font'); - } - $('#hidden_id').val(''); - return this.$element.val(); - } else { - if (!$('#autocompleteDoc').hasClass('active')) { - $('#autocompleteDoc').addClass('active'); - $('span.glyphicon-font', '#autocompleteDoc').removeClass('glyphicon-font').addClass('glyphicon-file'); - } - $('#autocompleteDoc').removeAttr('disabled'); - - $('#hidden_id').val(mapped[item].id); - return item; + updater: function (item) { + if (!item) { + if ($('#autocompleteDoc').hasClass('active')) { + $('#autocompleteDoc').removeClass('active'); + $('span.glyphicon-file', '#autocompleteDoc').removeClass('glyphicon-file').addClass('glyphicon-font'); + } + $('#hidden_id').val(''); + return this.$element.val(); + } else { + if (!$('#autocompleteDoc').hasClass('active')) { + $('#autocompleteDoc').addClass('active'); + $('span.glyphicon-font', '#autocompleteDoc').removeClass('glyphicon-font').addClass('glyphicon-file'); } + $('#autocompleteDoc').removeAttr('disabled'); + + $('#hidden_id').val(mapped[item].id); + return item; + } }, - sorter: function(items) { - /*if (items.length == 1) { - $('#hidden_id').val(mapped[items[0]].id); - console.log("setting hidden_id" + $('#hidden_id').val()); - if (!$('#autocompleteDoc').hasClass('active')) { - $('#autocompleteDoc').addClass('active'); - $('span.glyphicon-font', '#autocompleteDoc').removeClass('glyphicon-font').addClass('glyphicon-file'); - } - items.length = 0; - } else*/ - if(items.length > 0) { - $('#autocompleteDoc').removeAttr('disabled'); - } else if (items.length == 0) { - if ($('#autocompleteDoc').hasClass('active')) { - $('#autocompleteDoc').removeClass('active'); - $('span.glyphicon-file', '#autocompleteDoc').removeClass('glyphicon-file').addClass('glyphicon-font'); - } - $('#autocompleteDoc').attr('disabled','disabled'); + sorter: function (items) { + /*if (items.length == 1) { + $('#hidden_id').val(mapped[items[0]].id); + console.log("setting hidden_id" + $('#hidden_id').val()); + if (!$('#autocompleteDoc').hasClass('active')) { + $('#autocompleteDoc').addClass('active'); + $('span.glyphicon-font', '#autocompleteDoc').removeClass('glyphicon-font').addClass('glyphicon-file'); + } + items.length = 0; + } else*/ + if (items.length > 0) { + $('#autocompleteDoc').removeAttr('disabled'); + } else if (items.length == 0) { + if ($('#autocompleteDoc').hasClass('active')) { + $('#autocompleteDoc').removeClass('active'); + $('span.glyphicon-file', '#autocompleteDoc').removeClass('glyphicon-file').addClass('glyphicon-font'); } - var query = this.query; - items = items.sort(); - var start = items.filter(function(item) { return item.lastIndexOf(query, 0) == 0;}); - var elsewhere = items.filter(function(item) { return item.lastIndexOf(query, 0) != 0;}); - return start.concat(elsewhere); + $('#autocompleteDoc').attr('disabled', 'disabled'); + } + var query = this.query; + items = items.sort(); + var start = items.filter(function (item) { return item.lastIndexOf(query, 0) == 0; }); + var elsewhere = items.filter(function (item) { return item.lastIndexOf(query, 0) != 0; }); + return start.concat(elsewhere); } }); - -$('#autocompleteDoc').click(function() { + +$('#autocompleteDoc').click(function () { if (!$('#autocompleteDoc').hasClass('active')) $('.typeahead').typeahead('lookup').focus(); else { @@ -545,21 +645,21 @@ $('#autocompleteDoc').click(function() { }); -$('#randomDoc', '#searchForm').click(function() { - $.getJSON('../docs.json?random=1', function(rand) { - if (!$('#autocompleteDoc').hasClass('active')) { - $('#autocompleteDoc').button('toggle'); - $('span.glyphicon-font', '#autocompleteDoc').removeClass('glyphicon-font').addClass('glyphicon-file'); - } - $('#autocompleteDoc').removeAttr('disabled'); - $('#hidden_id', '#searchForm').val(rand[0].id); - $('#doc', '#searchForm').val(rand[0].label); - $('#doc', '#searchForm').css('font-weight', 'normal'); - $('#submit', '#searchForm').removeClass('btn-default'); - $('#submit', '#searchForm').addClass('btn-primary'); +$('#randomDoc', '#searchForm').click(function () { + $.getJSON('../docs.json?random=1', function (rand) { + if (!$('#autocompleteDoc').hasClass('active')) { + $('#autocompleteDoc').button('toggle'); + $('span.glyphicon-font', '#autocompleteDoc').removeClass('glyphicon-font').addClass('glyphicon-file'); + } + $('#autocompleteDoc').removeAttr('disabled'); + $('#hidden_id', '#searchForm').val(rand[0].id); + $('#doc', '#searchForm').val(rand[0].label); + $('#doc', '#searchForm').css('font-weight', 'normal'); + $('#submit', '#searchForm').removeClass('btn-default'); + $('#submit', '#searchForm').addClass('btn-primary'); }); }); -$('#randomDoc', '#searchForm').tooltip({title: "Random Document", placement: 'bottom'}); +$('#randomDoc', '#searchForm').tooltip({ title: "Random Document", placement: 'bottom' }); @@ -569,39 +669,39 @@ $('#randomDoc', '#searchForm').tooltip({title: "Random Document", placement: 'bo -if ($('.scale')[0] != null) $('.scale')[0].checked = (roottopic != null); +if ($('.scale')[0] != null) $('.scale')[0].checked = (roottopic != null); var ico; var maxRows = 25; var minCols = 2; -var margin = {top: 80, right: 40, bottom: 20, left: 15 + (icons.length * 20)}, - width = 960 - margin.left - margin.right, - height = 600 - margin.top - margin.bottom; +var margin = { top: 80, right: 40, bottom: 20, left: 15 + (icons.length * 20) }, + width = 960 - margin.left - margin.right, + height = 600 - margin.top - margin.bottom; var x = d3.scale.linear() - .range([0, width]); + .range([0, width]); var y = d3.scale.ordinal() - .rangeRoundBands([0, height], .1, 0); + .rangeRoundBands([0, height], .1, 0); var xAxis = d3.svg.axis() - .scale(x) - .orient("top") - .ticks(10, "%"); + .scale(x) + .orient("top") + .ticks(10, "%"); var yAxis = d3.svg.axis() - .scale(y) - .orient("left"); + .scale(y) + .orient("left"); -function computeWidth(numCols) { - $('#legend').attr("width", margin.right + (numCols*55) + 20 + margin.right); +function computeWidth(numCols) { + $('#legend').attr("width", margin.right + (numCols * 55) + 20 + margin.right); $('#chart #main').attr("width", Math.max($(window).width() - $('#legend').width() - 200 + margin.right, 750)); $('#controls').css("left", Math.max($(window).width() - $('#legend').width() - 200 + margin.right, 750) + 40); width = Math.max($(window).width() - $('#legend').width() - 200 + margin.right, 750) - margin.left - margin.right; x = d3.scale.linear() .range([0, width]); - x.domain([0,1]); + x.domain([0, 1]); xAxis = d3.svg.axis() .scale(x) .orient("top") @@ -609,11 +709,11 @@ function computeWidth(numCols) { } // Changed the height variable to better pair the topic bars with their documents -function computeHeight(data, numLegendRows) { +function computeHeight(data, numLegendRows) { height = (data.length * 35);// - margin.top - margin.bottom; y = d3.scale.ordinal() - .rangeRoundBands([0, height], .1, 0); - y.domain(data.map(function(d) { return d.id; })); + .rangeRoundBands([0, height], .1, 0); + y.domain(data.map(function (d) { return d.id; })); yAxis = d3.svg.axis() .scale(y) .orient("left"); @@ -623,35 +723,36 @@ var dataset; var original_root; var svg = d3.select("#chart").append("svg") - .attr("width", width + margin.left + margin.right) - .attr("height", height + margin.top + margin.bottom) - .attr("id","main") - .attr("class", "main") + .attr("width", width + margin.left + margin.right) + .attr("height", height + margin.top + margin.bottom) + .attr("id", "main") + .attr("class", "main") .append("g") - .attr("transform", "translate(" + margin.left + "," + margin.top + ")") - .on("mouseleave", function() { - $(".legend rect").removeClass('hover').tooltip('hide'); - }); + .attr("transform", "translate(" + margin.left + "," + margin.top + ")") + .on("mouseleave", function () { + $(".legend rect").removeClass('hover').tooltip('hide'); + }); var legend = d3.select("#chart").append("svg") - .attr("width", "350") - .attr("id", "legend") - .attr("class", "main") + .attr("width", "350") + .attr("id", "legend") + .attr("class", "main") .append("g") - .attr("transform","translate("+margin.right+","+ margin.top + ")"); + .attr("transform", "translate(" + margin.right + "," + margin.top + ")") + -function calculateTopicMap(data, scale, sortFn){ - data.forEach(function(d) { +function calculateTopicMap(data, scale, sortFn) { + data.forEach(function (d) { var sizeFactor = (scale) ? d.prob : 1.0 var x0 = 0; if (sortFn) d.topicMap = d3.keys(original_root.topics) .sort(sortFn) - .map(function(name) { return {name: name, x0: x0, x1: x0 += +(d.topics[name]*sizeFactor) }; }); + .map(function (name) { return { name: name, x0: x0, x1: x0 += +(d.topics[name] * sizeFactor) }; }); else // maintain sort order d.topicMap = d.topicMap.map(function (topic) { return topic.name; }) - .map(function(name) { return {name: name, x0: x0, x1: x0 += +(d.topics[name]*sizeFactor) }; }); + .map(function (name) { return { name: name, x0: x0, x1: x0 += +(d.topics[name] * sizeFactor) }; }); }); - + } var url; @@ -665,154 +766,154 @@ var n = inpho.util.getValueForURLParam('n'); if (n) url += "?n=" + n; var tops; -if (url) -d3.json(url, function(error, data) { - $('#status .bar').css('width', '50%').text('Loading topics...'); - if (error) { - $('#status .progress-bar').removeClass('active progress-bar-striped'); - var errormsg; - - if (roottopic) errormsg = "Invalid topic: " + roottopic + "."; - else if (q) errormsg = "Search terms not in model, try a different query." - else errormsg = "Invalid document: " + docid + "."; - - $('#status .bar').addClass('progress-bar-danger').text(errormsg); - return false; - } - d3.json("topics.json", function(error_top, topics) { - $('#status .bar').css('width', '75%').text('Rendering chart...'); - if (error_top) { +if (url) + d3.json(url, function (error, data) { + $('#status .bar').css('width', '50%').text('Loading topics...'); + if (error) { + $('#status .progress-bar').removeClass('active progress-bar-striped'); + var errormsg; + + if (roottopic) errormsg = "Invalid topic: " + roottopic + "."; + else if (q) errormsg = "Search terms not in model, try a different query." + else errormsg = "Invalid document: " + docid + "."; + + $('#status .bar').addClass('progress-bar-danger').text(errormsg); + return false; + } + d3.json("topics.json", function (error_top, topics) { + $('#status .bar').css('width', '75%').text('Rendering chart...'); + if (error_top) { $('#status .progress-bar').removeClass('active progress-bar-striped'); $('#status .progress-bar-danger').addClass('progress-bar-error').text('Could not load topic list.'); return false; } - console.log(topics); + console.log(topics); $('#submit').text(d3.keys(topics).length + ' Topics'); - - - var legendCols = Math.max(Math.ceil(d3.keys(topics).length / Math.min(data.length, maxRows)), minCols); - var legendFactor = Math.ceil(d3.keys(topics).length / legendCols); - computeHeight(data,legendFactor); - $("#chart #main").attr("height", height + margin.top + margin.bottom); - $("#legend").attr("height", (legendFactor * 20) + margin.top + margin.bottom); - computeWidth(legendCols); - - - x.domain([0, 1.0]); - tops = topics; + + + var legendCols = Math.max(Math.ceil(d3.keys(topics).length / Math.min(data.length, maxRows)), minCols); + var legendFactor = Math.ceil(d3.keys(topics).length / legendCols); + computeHeight(data, legendFactor); + $("#chart #main").attr("height", height + margin.top + margin.bottom); + $("#legend").attr("height", (legendFactor * 20) + margin.top + margin.bottom); + computeWidth(legendCols); + + + x.domain([0, 1.0]); + tops = topics; //.sort(); - dataset = data; - original_root = data[0]; - if (roottopic) docid = data[0]['doc']; - - svg.append("g") + dataset = data; + original_root = data[0]; + if (roottopic) docid = data[0]['doc']; + + svg.append("g") .attr("class", "x axis") .attr("transform", "translate(10,-10)") .call(xAxis) - .append("text") + .append("text") //.attr("transform", "rotate(-120)") .attr("class", "axis_label") .attr("dy", "-2em") .style("text-anchor", "start") .text("Similarity to " + $('.title').first().text()); - - svg.append("g") + + svg.append("g") .attr("class", "y axis") .call(yAxis) .selectAll("text") - .attr("class", function(d) { return (q == null && d == docid && roottopic == null) ? "primary" : "" }) - .on("click", function(d) { window.location.href = window.location.origin + window.location.pathname + "?doc=" + encodeURIComponent(d);}) - - svg.select(".y.axis").selectAll("g") + .attr("class", function (d) { return (q == null && d == docid && roottopic == null) ? "primary" : "" }) + .on("click", function (d) { window.location.href = window.location.origin + window.location.pathname + "?doc=" + encodeURIComponent(d); }) + + svg.select(".y.axis").selectAll("g") .insert("rect", ":first-child") - .attr("x", -margin.left + 5) - .attr("y", -9) - .attr("width", margin.left-5) - .attr("height", 18) - .style("opacity", "0"); - - var ticks = svg.select(".y.axis").selectAll("g") - .on("mouseenter", function(d) { + .attr("x", -margin.left + 5) + .attr("y", -9) + .attr("width", margin.left - 5) + .attr("height", 18) + .style("opacity", "0"); + + var ticks = svg.select(".y.axis").selectAll("g") + .on("mouseenter", function (d) { $('text', this).attr('text-decoration', 'underline') - .attr('font-weight', 'bold'); + .attr('font-weight', 'bold'); svg.selectAll(".doc") - .filter(function(doc,i) { return doc.doc == d}) - .attr("class", function(d) { return ((q == null && d.doc == docid && roottopic == null) ? "doc primary" : "doc") + " hover"}); - }) - .on("mouseleave", function(d) { - $('text',this).removeAttr('text-decoration') - .removeAttr('font-weight'); + .filter(function (doc, i) { return doc.doc == d }) + .attr("class", function (d) { return ((q == null && d.doc == docid && roottopic == null) ? "doc primary" : "doc") + " hover" }); + }) + .on("mouseleave", function (d) { + $('text', this).removeAttr('text-decoration') + .removeAttr('font-weight'); svg.selectAll(".doc") - .filter(function(doc,i) { return doc.doc == d}) - .attr("class", function(d) { return (q == null && d.doc == docid && roottopic == null) ? "doc primary" : "doc"}); - }); - - for (var i = 0; i < icons.length; i++) { - icon_fns[icons[i]](ticks,i, data); - } - - // draw total bar - var doc = svg.selectAll("doc") + .filter(function (doc, i) { return doc.doc == d }) + .attr("class", function (d) { return (q == null && d.doc == docid && roottopic == null) ? "doc primary" : "doc" }); + }); + + for (var i = 0; i < icons.length; i++) { + icon_fns[icons[i]](ticks, i, data); + } + + // draw total bar + var doc = svg.selectAll("doc") .data(data) - .enter().append("g") - .attr("class", function(d) { return (q == null && d.doc == docid && roottopic == null) ? "doc primary" : "doc"}) - .attr("transform", function(d) { return "translate(10," + y(d.id) + ")"; }) - .on("mouseover", function(d) { - var tick = $("text:contains(" + d.id +")") - .filter(function() { return $(this).text().trim() == d.id }) - .attr("font-weight", "bold"); - icons.reduce(function(prev,cur) { - return prev.next(".{0}Icon".format(cur)).css('opacity', '1.0'); - }, tick); - }) - .on("mouseout", function(d) { - var tick = $("text:contains(" + d.id +")") - .filter(function() {return $(this).text().trim() == d.id }) - .attr("font-weight", "normal"); - icons.reduce(function(prev, cur) { - return prev.next(".{0}Icon".format(cur)).css('opacity', ''); - }, tick); - }); - - var label2 = document.createElement('label'); - label2.classList.add("checkbox"); - label2.innerHTML = "Normalize Topic Bars";i - label2.style.left = "20px"; - - document.body.append(label2); - d3.select(".scale").on("change", scaleTopics); - - calculateTopicMap(data, !($('.scale')[0].checked), function(a,b) {return data[0].topics[b] - data[0].topics[a];}); - - var k = d3.keys(topics).length; - - // Draw topic bars - doc.selectAll("rect") - .data(function(d) { return d.topicMap; }) - .enter().append("rect") - .attr("height", y.rangeBand()/2.75) - .attr("x", function(d) { return x(d.x0); }) - .attr("y", 10) - .attr("width", function(d) { return x(d.x1) - x(d.x0); }) - .attr("class", function(d) { return "top_" + d.name; }) - .on("mouseover", function(d) { - // SVG element z-index determined by render order, not style sheet - // so element must be reappended to the end on hover so border - // is not occluded - var parent = $(this).parent(); - $(this).detach().appendTo(parent); - $(".docLabel", parent).detach().appendTo(parent); - $(".docLabel", parent).addClass("hover"); - $('.legend rect').not('.top_' + d.name).tooltip('hide'); - $(".top_" + d.name).addClass('hover'); - $('.legend rect.top_' + d.name).tooltip('show'); - }) - .on("mouseout", function(d) { - var parent = $(this).parent(); - $(".docLabel", parent).removeClass("hover"); - $(".top_" + d.name).removeClass('hover'); - }) - .on("click", function(d) { + .enter().append("g") + .attr("class", function (d) { return (q == null && d.doc == docid && roottopic == null) ? "doc primary" : "doc" }) + .attr("transform", function (d) { return "translate(10," + y(d.id) + ")"; }) + .on("mouseover", function (d) { + var tick = $("text:contains(" + d.id + ")") + .filter(function () { return $(this).text().trim() == d.id }) + .attr("font-weight", "bold"); + icons.reduce(function (prev, cur) { + return prev.next(".{0}Icon".format(cur)).css('opacity', '1.0'); + }, tick); + }) + .on("mouseout", function (d) { + var tick = $("text:contains(" + d.id + ")") + .filter(function () { return $(this).text().trim() == d.id }) + .attr("font-weight", "normal"); + icons.reduce(function (prev, cur) { + return prev.next(".{0}Icon".format(cur)).css('opacity', ''); + }, tick); + }); + + var label2 = document.createElement('label'); + label2.classList.add("checkbox"); + label2.innerHTML = "Normalize Topic Bars"; i + label2.style.left = "20px"; + + document.body.append(label2); + d3.select(".scale").on("change", scaleTopics); + + calculateTopicMap(data, !($('.scale')[0].checked), function (a, b) { return data[0].topics[b] - data[0].topics[a]; }); + + var k = d3.keys(topics).length; + + // Draw topic bars + doc.selectAll("rect") + .data(function (d) { return d.topicMap; }) + .enter().append("rect") + .attr("height", y.rangeBand() / 2.75) + .attr("x", function (d) { return x(d.x0); }) + .attr("y", 10) + .attr("width", function (d) { return x(d.x1) - x(d.x0); }) + .attr("class", function (d) { return "top_" + d.name; }) + .on("mouseover", function (d) { + // SVG element z-index determined by render order, not style sheet + // so element must be reappended to the end on hover so border + // is not occluded + var parent = $(this).parent(); + $(this).detach().appendTo(parent); + $(".docLabel", parent).detach().appendTo(parent); + $(".docLabel", parent).addClass("hover"); + $('.legend rect').not('.top_' + d.name).tooltip('hide'); + $(".top_" + d.name).addClass('hover'); + $('.legend rect.top_' + d.name).tooltip('show'); + }) + .on("mouseout", function (d) { + var parent = $(this).parent(); + $(".docLabel", parent).removeClass("hover"); + $(".top_" + d.name).removeClass('hover'); + }) + .on("click", function (d) { //Handles when to update the descriptor based off which mode it is in and what topic bar was clicked on. //Indicates whether the model is sorted by proportion of a specific topic or not. if (roottopic == null) { @@ -824,51 +925,53 @@ d3.json(url, function(error, data) { topDoc.style.display = 'block'; $("#focalDoc").text("Top 40 documents most similar to topic " + roottopic + " sorted by proportion of topic " + d.name); } - topicSort(d.name); }) - .style("fill", function(d) { return barColors(colors[k][d.name], d.name, svg); }); - - doc.append("text") - .text(function(d) { return d.label; }) - .attr("class","docLabel") - .attr("dx", "3") - .attr("dy", "8") - .filter(function(d) { return q && (d.label.indexOf(q) >= 0);}) - .each(function(d) { - if (q) { - var splits = q.split(' '); - var new_html = d.label; - for (var i = 0; i < splits.length; i++) { - var myRe = new RegExp(splits[i], 'gi'); - new_html = new_html.replace(myRe, '= 0); }) + .each(function (d) { + if (q) { + var splits = q.split(' '); + var new_html = d.label; + for (var i = 0; i < splits.length; i++) { + var myRe = new RegExp(splits[i], 'gi'); + new_html = new_html.replace(myRe, 'Topic {0}:".format(d) + "
    " - + d3.keys(topics[d].words).sort(function(a,b) { + + d3.keys(topics[d].words).sort(function (a, b) { if (topics[d].words[a] > topics[d].words[b]) return -1; else if (topics[d].words[a] < topics[d].words[b]) return 1; else return 0; - }).join(", ") + ", ..."; }) - .on("click", function(d) { + }).join(", ") + ", ..."; + }) + .on("click", function (d) { //Handles when to update the descriptor based off which mode it is in and what topic bar was clicked on. //Indicates whether the model is sorted by proportion of a specific topic or not. if (roottopic == null) { @@ -880,38 +983,39 @@ d3.json(url, function(error, data) { topDoc.style.display = 'block'; $("#focalDoc").text("Top 40 documents most similar to topic " + roottopic + " sorted by proportion of topic " + d); } - topicSort(d); }) - .on("mouseover", function(d) { - $(".top_" + d).addClass('hover').tooltip('show'); - }) - .on("mouseout", function(d) { - $(".top_" + d).removeClass('hover').tooltip('hide'); - }); - - $(".legend rect").tooltip({container:'body', trigger: 'manual', animation: false, html: true}); - - legendElts.append("text") + topicSort(d); + }) + .on("mouseover", function (d) { + $(".top_" + d).addClass('hover').tooltip('show'); + }) + .on("mouseout", function (d) { + $(".top_" + d).removeClass('hover').tooltip('hide'); + }); + + $(".legend rect").tooltip({ container: 'body', trigger: 'manual', animation: false, html: true }); + + legendElts.append("text") .attr("dx", -6) .attr("y", 9) .attr("dy", ".35em") .style("text-anchor", "end") - .text(function(d) { return d; }); - - - legend.append("text") + .text(function (d) { return d; }); + + + legend.append("text") .attr("dx", -6) .attr("dy", "-.35em") .attr("font-weight", "bold") .style("text-anchor", "end") .text(d3.keys(topics).length); - legend.append("text") + legend.append("text") //.attr("transform", "rotate(-120)") .attr("class", "axis_label") .attr("dy", "-.35em") .attr("font-weight", "bold") .style("text-anchor", "start") .text("Topics"); - legend.append("text") + legend.append("text") //.attr("transform", "rotate(-120)") .attr("class", "axis_label") .attr("dy", "-.45em") @@ -921,293 +1025,309 @@ d3.json(url, function(error, data) { .style("overflow-wrap", "normal") .text("ordered by proportion of T in " + (docid ? "focal document" : "corpus")); - var ns = 'http://www.w3.org/2000/svg'; - var newLegend = document.getElementById('legend'); - - var foreignObject = document.createElementNS(ns, 'foreignObject'); - foreignObject.setAttribute("width", 140); - foreignObject.setAttribute("height", 140); - foreignObject.setAttribute("transform", "translate(20, " + (((d3.keys(topics).length / 2) + 1) * 20 + 65) + ")"); - var div = document.createElement('div'); - div.innerHTML = 'Display Options'; - var label = document.createElement('label'); - label.classList.add("checkbox"); - label.innerHTML = "Alphabetical Sort"; - label.style.left = "20px"; - div.appendChild(label); - div.appendChild(label2); - - var button = document.createElement('button'); - $(button).addClass("btn btn-default reset"); - $(button).attr('disabled', true); - var t = document.createTextNode("Reset Topic Sort"); - button.appendChild(t); - div.appendChild(button); - div.appendChild(document.createElement('br')); - foreignObject.appendChild(div); - newLegend.append(foreignObject); - - button.onclick = resetTopicSort; - - d3.select(window).on('resize', resize); + var ns = 'http://www.w3.org/2000/svg'; + var newLegend = document.getElementById('legend'); + + var foreignObject = document.createElementNS(ns, 'foreignObject'); + foreignObject.setAttribute("width", 140); + foreignObject.setAttribute("height", 140); + foreignObject.setAttribute("transform", "translate(20, " + (((d3.keys(topics).length / 2) + 1) * 20 + 65) + ")"); + var div = document.createElement('div'); + div.innerHTML = 'Display Options'; + var label = document.createElement('label'); + label.classList.add("checkbox"); + label.innerHTML = "Alphabetical Sort"; + label.style.left = "20px"; + div.appendChild(label); + div.appendChild(label2); + + var button = document.createElement('button'); + $(button).addClass("btn btn-default reset"); + $(button).attr('disabled', true); + var t = document.createTextNode("Reset Topic Sort"); + button.appendChild(t); + div.appendChild(button); + div.appendChild(document.createElement('br')); + foreignObject.appendChild(div); + newLegend.append(foreignObject); + + button.onclick = resetTopicSort; + + d3.select(window).on('resize', resize); + + function resize() { + computeWidth(legendCols); + + /* Update the axis with the new scale */ + svg.select('.x.axis') + .call(xAxis); + + doc.selectAll('rect') + .attr("x", function (d) { return x(d.x0); }) + .attr("width", function (d) { return x(d.x1) - x(d.x0); }); + } - function resize() { - computeWidth(legendCols); - - /* Update the axis with the new scale */ - svg.select('.x.axis') - .call(xAxis); - - doc.selectAll('rect') - .attr("x", function(d) { return x(d.x0); }) - .attr("width", function(d) { return x(d.x1) - x(d.x0); }); } - d3.select(".sort").on("change", alphabetSort); - + $('#status .bar').addClass('bar-success').css('width', '100%').text("Complete!"); - setTimeout(function() { + setTimeout(function () { $('#status').hide(500); - setTimeout(function() {$('#controls').css({'top' : $('#legend').height() + $('#legend').position().top}).show();}, 500); - } , 500); - + setTimeout(function () { $('#controls').css({ 'top': $('#legend').height() + $('#legend').position().top }).show(); }, 500); + }, 500); + $(window).on("scroll", scrollLegend); - scrollLegend = function() { + scrollLegend = function () { var scrollPos = $(window).scrollTop(); var chartHeight = $('#chart').position().top; var legendHeight = $('#legend').height(); var heightFac = -60; - if((scrollPos - chartHeight - margin.top - heightFac) <= 0) { - $('#legend').css({'position': 'absolute', 'top' : chartHeight}); - $('#controls').css({'position': 'absolute', 'top' : legendHeight + chartHeight}); + if ((scrollPos - chartHeight - margin.top - heightFac) <= 0) { + $('#legend').css({ 'position': 'absolute', 'top': chartHeight }); + $('#controls').css({ 'position': 'absolute', 'top': legendHeight + chartHeight }); } else if ((scrollPos - chartHeight - heightFac) < (margin.top)) { - $('#legend').css({'position': 'absolute', 'top' : scrollPos + heightFac}); - $('#controls').css({'position': 'absolute', 'top' : legendHeight+ scrollPos + heightFac}); + $('#legend').css({ 'position': 'absolute', 'top': scrollPos + heightFac }); + $('#controls').css({ 'position': 'absolute', 'top': legendHeight + scrollPos + heightFac }); } else { - $('#legend').css({'position': 'fixed', 'top' : heightFac}); - $('#controls').css({'position': 'fixed', 'top' : legendHeight + heightFac}); - }} - + $('#legend').css({ 'position': 'fixed', 'top': heightFac }); + $('#controls').css({ 'position': 'fixed', 'top': legendHeight + heightFac }); + } + } + for (var i = 0; i < icons.length; i++) { - $(".{0}Icon".format(icons[i])).tooltip({placement: 'top', title: icon_tooltips[icons[i]], container: 'body', html: true, animation: false}); + $(".{0}Icon".format(icons[i])).tooltip({ placement: 'top', title: icon_tooltips[icons[i]], container: 'body', html: true, animation: false }); } - }); + $("#tutorial").removeAttr("data-step"); + $("#tutorial").removeAttr("data-intro"); + //$("#chart").attr("data-step", "2"); + //$("#chart").attr("data-intro", "The Hypershelf shows up to 40 documents that are most similar to the focal document. Each document is represented by a bar whose colors show the mixture and proportions of topics assigned to each document by the training process. The relative lengths of the bars indicate the degree of similarity to the focal document according to the topic mixtures."); + $("#legend").attr("data-step", "3"); + $("#legend").attr("data-intro", "Rolling over a colored segment shows the highest probability words associated with the topic. The key on the right shows all the topics identified by the model. If you click on a topic in the bar or the key, the display will sort the current documents ranked according to that topic. In this topic-sorted mode, a Top Documents button appears at the top that lets you retrieve the documents from the entire corpus that are most similar to that topic."); + document.querySelector(".form-group").removeAttribute("data-step"); + document.querySelector(".form-group").removeAttribute("data-intro"); + document.querySelector(".doc").setAttribute("id", "docDemonstration"); + document.querySelector(".doc").setAttribute("data-intro", "The Hypershelf shows up to 40 documents that are most similar to the focal document. Each document is represented by a bar whose colors show the mixture and proportions of topics assigned to each document by the training process. The relative lengths of the bars indicate the degree of similarity to the focal document according to the topic mixtures.") + $("#doc").attr("data-intro", "To select a NEW document, you can type here or select random document"); + $("#randomDoc").removeAttr("data-step"); + $("#randomDoc").removeAttr("data-intro"); + }); }); - function scaleTopics() { - var numTopics = dataset[0].topics.length; - var delay = function(d, i) { return i * (500/numTopics); }, - negdelay = function(d, i) { return (numTopics-i) * (500/numTopics); }; +function scaleTopics() { + var numTopics = dataset[0].topics.length; + var delay = function (d, i) { return i * (500 / numTopics); }, + negdelay = function (d, i) { return (numTopics - i) * (500 / numTopics); }; - calculateTopicMap(dataset, !this.checked); + calculateTopicMap(dataset, !this.checked); - $(".doc").each(function(i,elt) { - $(elt).children() - .sort(function(a,b) { return $(a).attr('x') - $(b).attr('x'); }) - .each(function(j,child) { - $(child).detach().appendTo($(elt)); - }) - }); + $(".doc").each(function (i, elt) { + $(elt).children() + .sort(function (a, b) { return $(a).attr('x') - $(b).attr('x'); }) + .each(function (j, child) { + $(child).detach().appendTo($(elt)); + }) + }); - svg.selectAll(".doc") - .selectAll("rect") - .data(function(d) { return d.topicMap; }) - .style("fill", function(d) { return barColors(colors[k][d.name], d.name, svg); }) - /*.on("mouseover", function(d) { - // SVG element z-index determined by render order, not style sheet - // so element must be reappended to the end on hover so border - // is not occluded - var parent = $(this).parent(); - $(this).detach().appendTo(parent); - $(".docLabel", parent).detach().appendTo(parent); - $('.legend rect').not('.top_' + d.name).tooltip('hide'); - $(".top_" + d.name).addClass('hover'); - $('.legend rect.top_' + d.name).tooltip('show'); - }) - .on("mouseout", function(d) { - $(".top_" + d.name).removeClass('hover'); - })*/ - .transition().duration(500).ease("linear").delay(this.checked ? delay : negdelay) - .attr("x", function(d) { return x(d.x0); }) - .attr("width", function(d) { return x(d.x1) - x(d.x0); }) - .attr("class", function(d) { return "top_" + d.name; }); - - svg.selectAll(".x.axis text.axis_label").text(this.checked ? - "Proportion of document assigned to topic" : - ("Similarity to " + $('.title').first().text())); - } + svg.selectAll(".doc") + .selectAll("rect") + .data(function (d) { return d.topicMap; }) + .style("fill", function (d) { return barColors(colors[k][d.name], d.name, svg); }) + /*.on("mouseover", function(d) { + // SVG element z-index determined by render order, not style sheet + // so element must be reappended to the end on hover so border + // is not occluded + var parent = $(this).parent(); + $(this).detach().appendTo(parent); + $(".docLabel", parent).detach().appendTo(parent); + $('.legend rect').not('.top_' + d.name).tooltip('hide'); + $(".top_" + d.name).addClass('hover'); + $('.legend rect.top_' + d.name).tooltip('show'); + }) + .on("mouseout", function(d) { + $(".top_" + d.name).removeClass('hover'); + })*/ + .transition().duration(500).ease("linear").delay(this.checked ? delay : negdelay) + .attr("x", function (d) { return x(d.x0); }) + .attr("width", function (d) { return x(d.x1) - x(d.x0); }) + .attr("class", function (d) { return "top_" + d.name; }); + + svg.selectAll(".x.axis text.axis_label").text(this.checked ? + "Proportion of document assigned to topic" : + ("Similarity to " + $('.title').first().text())); +} - function sortDataset(sortFn) { - dataset = dataset.sort(sortFn); +function sortDataset(sortFn) { + dataset = dataset.sort(sortFn); - var y0 = y.domain(dataset - .map(function(d) { return d.id; })) - .copy(); + var y0 = y.domain(dataset + .map(function (d) { return d.id; })) + .copy(); - var transition = svg.transition().duration(500), - delay = function(d, i) { return i * 25; }; + var transition = svg.transition().duration(500), + delay = function (d, i) { return i * 25; }; - transition.selectAll(".doc") - .delay(delay) - .attr("transform", function(d) { return "translate(10," + y(d.id) + ")"; }); - //.attr("y", function(d) { return y(d.id); }); + transition.selectAll(".doc") + .delay(delay) + .attr("transform", function (d) { return "translate(10," + y(d.id) + ")"; }); + //.attr("y", function(d) { return y(d.id); }); - transition.select(".y.axis") - .call(yAxis) - .selectAll("g") - .selectAll("text") - .delay(delay); - } + transition.select(".y.axis") + .call(yAxis) + .selectAll("g") + .selectAll("text") + .delay(delay); +} - function alphabetSort() { - // Copy-on-write since tweens are evaluated after a delay. - if (this.checked) - sortDataset(function(a, b) { return d3.ascending(a.label, b.label); }); - else - sortDataset(function(a, b) { return b.prob - a.prob; }); - } - - function resetTopicSort() { - $('.reset').attr('disabled',true); - $('.topicsort').attr('disabled',true); - $('.selected').removeClass('selected'); - $('.topdoc').text('Click a topic segment below to find related documents.'); - $('.topdoc').removeClass('btn-primary'); - $('.topdoc').addClass('btn-default'); - $('.topdoc').attr('disabled', 'disabled'); - $(document).ready(function() { - if (!($('.sort')[0].checked)) - sortDataset(function(a,b) { return b.prob - a.prob; }); - }); - redrawBars(function(a,b) { return original_root.topics[b] - original_root.topics[a]; }); - } +function alphabetSort() { + // Copy-on-write since tweens are evaluated after a delay. + if (this.checked) + sortDataset(function (a, b) { return d3.ascending(a.label, b.label); }); + else + sortDataset(function (a, b) { return b.prob - a.prob; }); +} - function topicSort(topic) { - // Copy-on-write since tweens are evaluated after a delay. - $('.sort').removeAttr('checked'); - if (topic) { - sortDataset(function(a, b) { return b.topics[topic] - a.topics[topic]; }); - $('.selected').removeClass('selected'); - $(".top_" + topic).addClass('selected'); - $('.reset').removeAttr('disabled'); - if (topic == roottopic) { - $('.topdoc').css('font-weight', 'bold'); - $('.topdoc').removeClass('btn-primary'); - $('.topdoc').addClass('btn-default'); - } else { - $('.topdoc').css('font-weight', 'normal'); - $('.topdoc').removeClass('btn-default'); - $('.topdoc').addClass('btn-primary'); - } - $('.topdoc').removeAttr('disabled'); - $('.topdoc').text('Retrieve Documents for Topic ' + topic); - $('.topdoc').click(function() { location.href = location.origin + location.pathname + '?topic=' + topic;}); - $('.topdoc').mouseenter(function() { - $('.legend rect').not('.top_' + topic).tooltip('hide'); - $(".legend rect.top_" + topic).tooltip('show'); }); - $('.topdoc').mouseleave(function() { $(".top_" + topic).tooltip('hide'); }); +function resetTopicSort() { + $('.reset').attr('disabled', true); + $('.topicsort').attr('disabled', true); + $('.selected').removeClass('selected'); + $('.topdoc').text('Click a topic segment below to find related documents.'); + $('.topdoc').removeClass('btn-primary'); + $('.topdoc').addClass('btn-default'); + $('.topdoc').attr('disabled', 'disabled'); + $(document).ready(function () { + if (!($('.sort')[0].checked)) + sortDataset(function (a, b) { return b.prob - a.prob; }); + }); + redrawBars(function (a, b) { return original_root.topics[b] - original_root.topics[a]; }); +} +function topicSort(topic) { + // Copy-on-write since tweens are evaluated after a delay. + $('.sort').removeAttr('checked'); + if (topic) { + sortDataset(function (a, b) { return b.topics[topic] - a.topics[topic]; }); + $('.selected').removeClass('selected'); + $(".top_" + topic).addClass('selected'); + $('.reset').removeAttr('disabled'); + if (topic == roottopic) { + $('.topdoc').css('font-weight', 'bold'); + $('.topdoc').removeClass('btn-primary'); + $('.topdoc').addClass('btn-default'); } else { - $('.selected').removeClass('selected'); - sortDataset(function(a, b) { return b.prob - a.prob; }); + $('.topdoc').css('font-weight', 'normal'); + $('.topdoc').removeClass('btn-default'); + $('.topdoc').addClass('btn-primary'); } + $('.topdoc').removeAttr('disabled'); + $('.topdoc').text('Retrieve Documents for Topic ' + topic); + $('.topdoc').click(function () { location.href = location.origin + location.pathname + '?topic=' + topic; }); + $('.topdoc').mouseenter(function () { + $('.legend rect').not('.top_' + topic).tooltip('hide'); + $(".legend rect.top_" + topic).tooltip('show'); + }); + $('.topdoc').mouseleave(function () { $(".top_" + topic).tooltip('hide'); }); - - var sortFn = function(a,b) { - if (a == topic) return -1; - else if (b == topic) return 1; - else return dataset[0].topics[b] - dataset[0].topics[a]; - //else return original_root.topics[b] - original_root.topics[a]; - } - redrawBars(sortFn); + } else { + $('.selected').removeClass('selected'); + sortDataset(function (a, b) { return b.prob - a.prob; }); } - function redrawBars(sortFn) { - $("#legend .hover").removeClass("hover"); - var numTopics = dataset[0].topics.length; - var delay = function(d, i) { return i * (1000/numTopics); }, - negdelay = function(d, i) { return (numTopics-i) * (1000/numTopics); }; - calculateTopicMap(dataset, !($('.scale')[0].checked), sortFn); - - svg.selectAll(".doc") - .selectAll("rect") - .data(function(d) { return d.topicMap; }) - .style("fill", function(d) { return barColors(colors[k][d.name], d.name, svg); }) - /* - .on("mouseover", function(d) { - // SVG element z-index determined by render order, not style sheet - // so element must be reappended to the end on hover so border - // is not occluded - var parent = $(this).parent(); - $(this).detach().appendTo(parent); - $(".docLabel", parent).detach().appendTo(parent); - $('.legend rect').not('.top_' + d.name).tooltip('hide'); - $(".top_" + d.name).addClass('hover'); - $('.legend rect.top_' + d.name).tooltip('show'); - }) - .on("mouseout", function(d) { - $(".top_" + d.name).removeClass('hover'); - })*/ - .transition().duration(1000).ease("linear").delay(this.checked ? delay : negdelay) - .attr("x", function(d) { return x(d.x0); }) - .attr("width", function(d) { return x(d.x1) - x(d.x0); }) - .attr("class", function(d) { return "top_" + d.name; }); + var sortFn = function (a, b) { + if (a == topic) return -1; + else if (b == topic) return 1; + else return dataset[0].topics[b] - dataset[0].topics[a]; + //else return original_root.topics[b] - original_root.topics[a]; } + redrawBars(sortFn); +} - // From StackOverflow: https://stackoverflow.com/a/21648508 - function hexToRgbA(hex, a){ - var c; - if(/^#([A-Fa-f0-9]{3}){1,2}$/.test(hex)){ - c= hex.substring(1).split(''); - if(c.length== 3){ - c= [c[0], c[0], c[1], c[1], c[2], c[2]]; - } - c= '0x'+c.join(''); - return 'rgba('+[(c>>16)&255, (c>>8)&255, c&255].join(',')+',' + a + ')'; +function redrawBars(sortFn) { + $("#legend .hover").removeClass("hover"); + var numTopics = dataset[0].topics.length; + var delay = function (d, i) { return i * (1000 / numTopics); }, + negdelay = function (d, i) { return (numTopics - i) * (1000 / numTopics); }; + calculateTopicMap(dataset, !($('.scale')[0].checked), sortFn); + + svg.selectAll(".doc") + .selectAll("rect") + .data(function (d) { return d.topicMap; }) + .style("fill", function (d) { return barColors(colors[k][d.name], d.name, svg); }) + /* + .on("mouseover", function(d) { + // SVG element z-index determined by render order, not style sheet + // so element must be reappended to the end on hover so border + // is not occluded + var parent = $(this).parent(); + $(this).detach().appendTo(parent); + $(".docLabel", parent).detach().appendTo(parent); + $('.legend rect').not('.top_' + d.name).tooltip('hide'); + $(".top_" + d.name).addClass('hover'); + $('.legend rect.top_' + d.name).tooltip('show'); + }) + .on("mouseout", function(d) { + $(".top_" + d.name).removeClass('hover'); + })*/ + .transition().duration(1000).ease("linear").delay(this.checked ? delay : negdelay) + .attr("x", function (d) { return x(d.x0); }) + .attr("width", function (d) { return x(d.x1) - x(d.x0); }) + .attr("class", function (d) { return "top_" + d.name; }); + +} + +// From StackOverflow: https://stackoverflow.com/a/21648508 +function hexToRgbA(hex, a) { + var c; + if (/^#([A-Fa-f0-9]{3}){1,2}$/.test(hex)) { + c = hex.substring(1).split(''); + if (c.length == 3) { + c = [c[0], c[0], c[1], c[1], c[2], c[2]]; } - throw new Error('Bad Hex'); + c = '0x' + c.join(''); + return 'rgba(' + [(c >> 16) & 255, (c >> 8) & 255, c & 255].join(',') + ',' + a + ')'; } + throw new Error('Bad Hex'); +} - function barColors(myColor, myId, svg) { - var mainGradient = svg.append('linearGradient') - .attr('id', myId); - mainGradient.append('stop') - .attr('stop-color', myColor) - .attr('offset', '0'); - mainGradient.append('stop') - .attr('stop-color', hexToRgbA(myColor, .7)) - .attr('offset', '1'); - return "url(#" + myId + ")"; - } +function barColors(myColor, myId, svg) { + var mainGradient = svg.append('linearGradient') + .attr('id', myId); + mainGradient.append('stop') + .attr('stop-color', myColor) + .attr('offset', '0'); + mainGradient.append('stop') + .attr('stop-color', hexToRgbA(myColor, .7)) + .attr('offset', '1'); + return "url(#" + myId + ")"; +} fingerprint.host = '../'; $('#home-link').attr('href', '../'); $('#cluster-link').attr('href', '../topics'); -$('.topic-link').each(function(i,elt) { - var url = '../' + $(elt).attr('href'); - if(docid) url += '?doc=' + docid; - $(this).attr('href', url); - }); +$('.topic-link').each(function (i, elt) { + var url = '../' + $(elt).attr('href'); + if (docid) url += '?doc=' + docid; + $(this).attr('href', url); +}); $.fn.followTo = function (pos) { - var $this = this, - $window = $(window); - - $window.scroll(function (e) { - if ($window.scrollTop() > pos) { - $this.css({ - position: 'fixed', - top: 120 - }); - } else { - $this.css({ - position: 'absolute', - top:405 - }); - } - }); + var $this = this, + $window = $(window); + + $window.scroll(function (e) { + if ($window.scrollTop() > pos) { + $this.css({ + position: 'fixed', + top: 120 + }); + } else { + $this.css({ + position: 'absolute', + top: 405 + }); + } + }); }; $('#legend').followTo(285); From 8538dc6f47abef04cc51a811fb9485696d0d0701 Mon Sep 17 00:00:00 2001 From: ramiyer1998 Date: Tue, 11 Dec 2018 20:43:03 -0500 Subject: [PATCH 2/5] removed remnants of intro.js --- www/bars.mustache.html | 10 +++++----- www/cluster.mustache.html | 6 +++--- www/splash.mustache.html | 13 ++++--------- 3 files changed, 12 insertions(+), 17 deletions(-) diff --git a/www/bars.mustache.html b/www/bars.mustache.html index 4133680d..8ec43018 100755 --- a/www/bars.mustache.html +++ b/www/bars.mustache.html @@ -3,7 +3,7 @@
    -

    InPhO Topic Explorer

    +

    InPhO Topic Explorer

    {{#corpus_link}}{{corpus_name}}{{/corpus_link}} @@ -26,19 +26,19 @@

    +

    Getting Started